当我们使用baidu或者Google时,你输入很少的字符,就会自动跳出来一些建议选项,在Solr里,我们称之为Suggest,在solrconfig.xml里做一些简单的配置,即可实现这一功能。配置如下:

<searchComponent name="suggest" class="solr.SuggestComponent"><lst name="suggester"><str name="name">mySuggester</str><str name="lookupImpl">FuzzyLookupFactory</str>      <str name="dictionaryImpl">DocumentDictionaryFactory</str><str name="field">cat</str><str name="weightField">price</str><str name="suggestAnalyzerFieldType">string</str><str name="buildOnStartup">false</str></lst></searchComponent><requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" ><lst name="defaults"><str name="suggest">true</str><str name="suggest.count">10</str></lst><arr name="components"><str>suggest</str></arr></requestHandler>

元素 <searchComponent> 的属性说明:

name:指定searchComponent的名字。可以定义多个<searchComponent>,只要名字不一样。在<requestHandler> --> <arr name="components"> --> <str> 里的值是指用哪个<searchComponent>。

<lst name="suggester"> 的一些属性

属性 描述
name suggest的名字,用于区分多个suggest。在请求参数中加入suggest.dictionary=mySuggester来指定使用哪个suggester
lookupImpl 查询实现类,表示如何在Suggestions 字典中找到分词(Term)
dictionaryImpl 字典实现类,表示分词(Term)是如何存储Suggestion字典的
field

表示suggestion的内容是基于哪个字段的。这里设置的field的stored属性必须是True。这可以设置为一个copyField,这样suggetion

就可台基于多个字段了。

sourceLocation 当dictionaryImpl为 FileDictionaryFactory时,指定此值,表示字典文件的路径
storeDir 存储字典文件的位置
buildOnCommit

默认值false。表示仅当请求的URL中包含suggest.build=true 时,才会创建 lookup的data。

为true时,表示lookup的data将在soft-commit后重新创建。

当索引比较大,尤其soft-commit很频繁时,建议设置为FALSE。此时应该手动地在请求中加上suggest.build=true 去触发构建lookup data的动作

buildOnOptimize 同上。区别是上面是soft-commit时,这里是索引优化时
buildOnStartup

设置为true,表示Solr启动或者Core重新加载时,构建suggestions的data。如果没有指定参数(文档中并没有说是设置为false),如果在磁盘上找不

到lookup data,则suggester将会构建它。通常建议设置成false,通过buildOnCommit中提到的方法去构建lookup data。

在同一个<searchComponent>里面,可以定义多个suggester (name 必须不一样)。如:

<searchComponent name="suggest" class="solr.SuggestComponent"><lst name="suggester"><str name="name">fuzzySuggester</str><str name="lookupImpl">FuzzyLookupFactory</str>      <str name="dictionaryImpl">DocumentDictionaryFactory</str><str name="field">cat</str><str name="weightField">price</str><str name="suggestAnalyzerFieldType">string</str><str name="buildOnStartup">false</str></lst><lst name="suggester"><str name="name">freeTextSuggester</str><str name="lookupImpl">FreeTextLookupFactory</str>      <str name="dictionaryImpl">DocumentDictionaryFactory</str><str name="field">cat</str><str name="weightField">price</str><str name="suggestAnalyzerFieldType">string</str><str name="buildOnStartup">false</str></lst></searchComponent>

定义多个Suggester后,我们可以在

1. <requestHandler>中指定使用哪个(或哪些)Suggester。如:

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" ><lst name="defaults"><str name="suggest">true</str><str name="suggest.count">10</str><str name="suggest.dictionary">freeTextSuggester</str><str name="suggest.dictionary">fuzzySuggester</str></lst><arr name="components"><str>suggest</str></arr></requestHandler>

2. 使用Solrj 去连接Solr进行"/suggest" 查询时,可以指定如下参数:

SolrQuery params = new SolrQuery();
params.set("qt", "/suggest");
params.set("suggest", "true"); //启用Suggest
params.set("suggest.build", "true");
params.set("suggest.dictionary", "fuzzySuggester");
params.set("suggest.dictionary", "freeTextSuggester");...

3. 自己使用http去Get 时:

http://localhost:8983/solr/techproducts/suggest?suggest=true&suggest.dictionary=fuzzySuggester&suggest.dictionary=freeTextSuggester&wt=json&suggest.q=elec

在<requestHandler name="/suggest">中的<lst name="defaults">里可以设置如下一些suggest的默认属性,其值可被URL中相同的参数覆盖

参数 描述
suggest 肯定设置为true
suggest.dictionary suggester 的名字,可能过上面3种方法设置
suggest.q 在页面上输入的值。
suggest.count Solr返回的建议的分词的数量
suggest.cfq

用于过滤suggestion的基于context field的 Context Filter Query。仅AnalyzingInfixLookupFactory 和 BlendedInfixLooupFactory

支持此属性,并且dictionaryImpl 必须是 Document*Dictionary

suggest.build 如果为 true, 则会构建lookup data。通常不可能每次请求都去构建。使用情境见上面的buildOnCommit
suggest.reload  为true时,重新加载 suggester index
suggest.buildAll  为true时, 创建所有的suggester index。不明白和suggest.build有什么区别
suggest.reloadAll  为true时,重新加载所有suggester index。不明白和 reload有什么区别

在程序员的世界里,学习任何语言或者技术,光看书是没有用的。看的时候感觉都懂。实际做的时候就这也不会那也不会。还是得靠实践。于是自己动手做了一个文件及其内容搜索的小程序,以此来加强对Solr的认识。设置了一些field:filename, filetype, filesize, content。这些用来存储文件相关的信息,还有一个名为text的copyField,用于存储所有值,以便查询时只需指定一个field。定义如下:

<field name="filename" type="string" index="true" stored="true"  />
<field name="filetype" type="string" index="true" stored="true"  />
<field name="filepath" type="decent_path" index="true" stored="true"  />
<field name="filetsize" type="tint" index="true" stored="true"  />
<field name="content" type="text_general" index="false" stored="true" multiValues="true" />
<field name="text" type="text_general" index="true" stored="false" multiValues="true" /><copyField source="filename" dest="text" />
<copyField source="filetype" dest="text" />
<copyField source="filesize" dest="text" />
<copyField source="filepath" dest="text" />
<copyField source="content" dest="text" />

使用suggester的时候遇到的一些问题:

1. 一开始,suggester的 field 设置的是 "text",我本想是让所有的信息都可以做为建议项。用的是FuzzyLoopupFactory,可是发现建议项一直是空。不知道是哪边出了问题,以为是copyField的问题,但是文档写了可以用copyField的。尝试把field设置成"filename",可以出现建议项了。又仔细读了一次文档,发现原来“text”的stored属性是false。改成true后,就成功了。

2. 另外,期间我也有把field 改成"content",它的stored值是true,indexed值是false。可是还是不能成功得到建议项。把indexed的值改成true,这时,content这个field的属性和"text"是一样的了,但是建议项一直为空!!上网搜了一下,网上也都是抄抄官方文档的内容,找不到原因。突然发现suggester里面有一个suggestAnalyzerFieldType的属性,其值为string (见本篇最开始部分的配置),再查了一下文档,发现这是AnalyzingLookupFactory里的一个属性,而FuzzyLookupFactory是继承AnalyzingLookupFactory的,这个属性指定的是查询和创建suggest时,字段的类型。“content”的字段类型是text_general,而我配置的是string,所以找不到建议项。改成text_general后 -- 纳尼?还是查不到建议项。看了一下我的程序的日志,发现是有建议项的,只不过建议的内容是整个文件的内容,太长了。可能是前端jQuery的suggest组件会把过长的建议项删除。因此UI 上看不到。但是后台确实是有建议项的。注意:输入的内容必须是整个文件内容的开始字符。

3. 期间我也不小心索引了一个图片文件,不是文本的文件。结果查询时,抛了下面的exception。去掉这个图片的索引后就好了。

Caused by: java.lang.StackOverflowError

at org.apache.lucene.util.automaton.Operations.topoSortStatesRecurse(Operations.java:1288)
  at org.apache.lucene.util.automaton.Operations.topoSortStatesRecurse(Operations.java:1293)
  at org.apache.lucene.util.automaton.Operations.topoSortStatesRecurse(Operations.java:1293)

其实我想实现的Suggest是:如果有下面的一段文本,我在页面的搜索框里输入:man,会自动列出 manager,management和mana三个选项。

The manager of this management company is Mana.

但是上面配置的FuzzyLookupFactory,并不能实现这一需求。把suggester改成FreeTextLookupFactory,可以实现此需求。

<searchComponent name="suggest" class="solr.SuggestComponent"><lst name="suggester"><str name="name">mySuggester</str><str name="lookupImpl">FreeTextLookupFactory</str>      <str name="dictionaryImpl">DocumentDictionaryFactory</str><str name="field">content</str><str name="weightField">content</str><str name="suggestFreeTextAnalyzerFieldType">text-general</str><str name="buildOnStartup">false</str><str name="buildOnCommit">true</str></lst></searchComponent>

上一篇:

Solr 6.7学习笔记(02)-- 配置文件 managed-schema (schema.xml) -- 样例(6)

转载于:https://www.cnblogs.com/langfanyun/p/7459506.html

Solr 6.7学习笔记(04)-- Suggest相关推荐

  1. 取得 Git 仓库 —— Git 学习笔记 04

    取得 Git 仓库 -- Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区.索引.本地版本库之间的交互:二是本地版本库和远程版本库之间的交互.第一块是基础,第二块是难点. 下面, ...

  2. JavaWeb黑马旅游网-学习笔记04【BaseServlet抽取】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...

  3. JavaWeb-综合案例(用户信息)-学习笔记04【删除选中功能】

    Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...

  4. JavaScript学习笔记04【高级——DOM和事件的简单学习、BOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

  5. MySQL学习笔记04【数据库的查询操作、今日内容、表的约束】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  6. CSS学习笔记-04 a标签-导航练习

    个人练习,各位大神勿笑  .. <!DOCTYPE html> <html lang="en"> <head><meta charset= ...

  7. ES6学习笔记04:Set与Map

    ES6学习笔记04:Set与Map JS原有两种数据结构:Array与Object,ES6新增两种数据结构:Set与Map 一.Set数据结构 Set类似于数组,但是成员值不允许重复,因此主要用于数据 ...

  8. Scala学习笔记04:内建控制结构

    Scala学习笔记04:内建控制结构 scala提供的控制结构并不算多,因为在函数式编程中,可以自己开发出各种功能的控制结构,所以scala提供的原生控制结构仅仅够用为止. 1.if - 判断 if是 ...

  9. openCVPracticalExercise学习笔记04

    原创:openCVPracticalExercise学习笔记04 30使用OpenCV实现图像孔洞填充 31使用OpenCV将一个三角形仿射变换到另一个三角形 1 2 3 4 5 6 7 8 9 10 ...

最新文章

  1. vc2010访问局域网mysql_VC2010利用MySQL++访问mysql. 及连接池示例
  2. 参数化测试 junit_JUnit 5 –参数化测试
  3. springmvc+mybatis+ehcache+redis+dubbo架构
  4. css多行多列的新闻模式
  5. tf.shape()和tf.reshape()
  6. IObit Uninstaller(卸载工具) v10.0.2.20
  7. ECMAScript6 Proxy和Reflect 对象操作拦截以及自定义
  8. matlab如何调整顺时针逆时针,关于算法:确定线段的方向是顺时针还是逆时针
  9. Android 实现图片闪烁效果
  10. QT二进制流方式读写文件
  11. 罗马数字转换python_20190502-罗马数字转换为数字
  12. 书籍 -- 《高性能MySQL》持续更新中(四)
  13. SDN控制器的功能及作用—Vecloud
  14. 高通平台tp驱动(一)
  15. 云计算之阿里云认证题库解析
  16. 读mysql必知必会有感_读《MySql必知必会》笔记
  17. 年化率,夏普率,最大回撤计算方法
  18. Ubuntu共享WiFi(AP)给Android方法汇总
  19. python巧妙解决空瓶换酒问题
  20. 《职来职往》里那点儿震惊无数大学生的语言

热门文章

  1. python中整数类型有—3_Python3 基本数据类型(3)
  2. 软件工程之快速原型模型
  3. mongodb与java结合_MongoDB初探系列之四:MongoDB与Java共舞
  4. Mysql(11)——group by的用法
  5. jsp ajax三级联动,Spring MVC+JSP实现三级联动
  6. 启动标志_牛股启动的标志:天衣无缝。
  7. Android安卓模拟器中模拟SD卡
  8. 静态、动态内存分配比较
  9. 二叉树中任意两个节点的距离
  10. 文件读写错误坑 之 UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position