设为首页 收藏本站
查看: 1158|回复: 0

[经验分享] Solr 6.7学习笔记(04)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-19 09:41:12 | 显示全部楼层 |阅读模式
  当我们使用baidu或者Google时,你输入很少的字符,就会自动跳出来一些建议选项,在Solr里,我们称之为Suggest,在solrconfig.xml里做一些简单的配置,即可实现这一功能。配置如下:
  

<searchComponent name="suggest">  <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" 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">  <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" 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。不明白和>   在程序员的世界里,学习任何语言或者技术,光看书是没有用的。看的时候感觉都懂。实际做的时候就这也不会那也不会。还是得靠实践。于是自己动手做了一个文件及其内容搜索的小程序,以此来加强对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">  <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)

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425610-1-1.html 上篇帖子: solr 使用edismax来控制评分 下篇帖子: Solr 6.7学习笔记(05)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表