用solr自动补全

自动补全已经变成了每一个应用程序基础部分特性。构建一个快速的,可扩展的自动补全对一个一直在增长数据的程序来说是个相当大的工程。我见过的其中最好的自动补全是Quora的搜索自动补全。我知道google和youtube也有最好的,但是我只想聚焦于小公司而不是巨头。这是一篇在Quora’s
autocomplete
上解释的他们如何用C++设计构建的自动补全。

在这篇文章中,我们将使用solr搜索殷勤提供一个像样的自动补全。Solr像一个文档数据库一样工作,在这个数据库中,一条记录就是一个文档。在Solr中你用所有可能的域定义一个schema。当你定义域的时候同时也指定了每个域的类型。例如:

<field name="username" type="text" indexed="true" stored="true" multiValued="false" />
<field name="category" type="text" indexed="true" stored="true" multiValued="false" />
<field name="create_date" type="date" indexed="true" stored="true" multiValued="false" />
<field name="pins" type="long" indexed="true" stored="true" multiValued="false" />

正如你看到的,我们把username和category定义为text类型,create_date定义为date类型,pins定义为long类型。这使Solr可以基于域类型执行一些高级查询。对于自动补全,我们需要一个随着搜素可以提供子文本的文本域。但是除非你专门为它设计了一个解析器,否则Solr在匹配字符串上面做的并不是很好。有两种解析器是NGram和EdgeNGram。

NGramTokenizerFactory是一个可以把字符串切成指定长度的字符串块的解析器。这个分词器有两个参数:

<fieldType name="text" class="solr.TextField" >
<analyzer type="index">
   <tokenizer class="solr.KeywordTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
   <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15" />
 </analyzer>
 <analyzer type="query">
   <tokenizer class="solr.KeywordTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
</fieldType>

在你的Solr中使用这个设置将会是Solr把文本截成子字符串执行匹配。这可能会产生不良的结果,并且使solr做不需要的子字符串计算。例如:“Steve”被切分为"st","te","ev","ve","ste","tev"等等。

EdgeNGramFilterFactory是一个子字符串来自于边界的解析器。也就是要么来自于单词前面要么来自于单词后面。例如:"Steve"将被解析为"ste","eve","stev"等等。

<fieldType name="prefix_token" class="solr.TextField" positionIncrementGap="1">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
  </analyzer>
</fieldType>

上面的设置定义边界块来生成2到15之间大小的块并且只考虑了做前边界的块。这个效果对自动补全目的是相当不错的。

由于我们定义了一个新域类型"prefix_token",我们就可以在solr中设置prefix_token的类型的域。

<field name="fullname" type="prefix_token" indexed="true" stored="true" multiValued="false" />

现在用全名查询Solr将产生一个好的结果。假设你只需要users并且忽略其它的文档,那么你可以添加另一个条件选择"user"类型的文档。你也可以使用帮助用高社交媒体得分来推送结果到顶部。

?q={!boost b=log(social_score)}(fullname:Steve)

注意:Solr支持TermsComponent,它给一个查询字符串返回一个拼写检查的数组。但是我们需要一个自动补全,从那上面选择一个结果重定向到特别的文档url。还有我们想要在自动补全中展示用户的头像,那就意味着我们需要完成文档而不是拼写支持。

时间: 2024-10-12 17:14:47

用solr自动补全的相关文章

solr进阶七:与jQuery结合的自动补全功能

网上有大量的jQuery自动补全功能的插件,我实现这个功能是采用网友写好的纯jQuery代码,而不是采用插件,因为特效会差很多.而后台的数据是从solr那边获取过来,通过整理,放到对象中,再放到集合中,然后在servlet层解开,生成xml文件,返回到前台,形成自动提示补全的功能,流程非常简单,没有采用框架技术,只是用了JSP的servlet来做中间层而已. 目录结构如下: 1.先编写实体类src\com\lifeix\entity\Word.java package com.lifeix.en

jQuery UI Autocomplete自动补全

项目上用到solr搜索引擎,在输入框输入字符的时候,想做到类似百度的效果,下拉框出现10个建议词条,为此,用上了jQuery UI Autocomplete 做自动补全 jsp页面样例: <%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="/WEB-INF/view

VIM的自动补全

自动补全可以很好的提高输入的效率: 触发自动补全的方法总结: 可供弹出式菜单的使用的命令: 其它再补充:

Linux Vim中自动补全Python插件:Pydiction

Pydiction 可以是我们使用Tab键自动补全Python代码在Vim,是一款非常不错的插件. Pydiction不需要安装,所有没有任何依赖包问题,Pydiction主要包含三个文件. python_pydiction.vim  -- Vim plugin that autocompletes Python code. complete-dict         -- Dictionary file of Python keywords, modules, etc. pydiction.p

Ubuntu 16.04.2 LTS 安装python vim自动补全工具pydiction

Pydiction 可以是我们使用Tab键自动补全Python代码在Vim,是一款非常不错的插件. 下载Pydiction mkdir ~/.vim mkidr ~/.vim/tools cd ~/.vim/tools #可以先下载好放到Ubuntu系统中 git clone https://github.com/rkulla/pydiction.git 配置Pydiction #- UNIX/LINUX/OSX: Put python_pydiction.vim in ~/.vim/after

vim 添加php自动补全 并格式化代码

自动补全,修改/etc/vimrc的配置 vim /etc/vimrc 添加: filetype plugin on autocmd FileType php set omnifunc=phpcomplete#CompletePHP 格式化代码:一下是按键 gg shift + v shifg + g = 参考:

Eclipse自动补全功能管理

#这种方法只适用于Eclipse Classic版本(这个版本带有插件的源码) 在使用Eclispe的过程,感觉自动补全做的不好,没有VS的强大.下面说两个增强自动补全的方法: 1.增加Eclipse的提示功能 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activation下,我们可以在"."号后面加入我们需要自动提示的首字幕,比如"a

Myeclipse设置关键词自动提示功能以及取消空格和&quot;=&quot;的自动补全

一.设置Myeclipse从a~z的自动提示功能 1. “window”→“Preferences”2. 选择“Java”,展开,“Editor”,选择“Content Assist”.3. 选择“Content Assist”,然后看到右边,右边的“Auto-Activation”下面的“Auto Activation triggers for java”这个选项.其实就是指触发代码提示的就是“.”这个符号.4. “Auto Activation triggers for java”这个选项,

Vim设置括号自动补全和快速跳出

一.设置括号自动补全 inoremap ' ''<ESC>i inoremap " ""<ESC>i inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC>i<CR><ESC>V<O 其中花括号{设置,自动补全并换行缩进,这在写函数的时候或语句块的时候特别有用. 参考: http://blog.csdn.net/dark_fi