10003---solr查询不使用query analyzer中文分词的问题解决
2016-03-14 00:41
375 查看
原文
schema.xml已配置query的中文分词器,但搜索的结果不尽如意,solr并没有按照分词来进行搜索。
比如搜索“我要吃饭了”,并没有把包含“吃饭”的文档给搜索出来。解决过程如下:
1.query analyzer使用IK,配置如下:
Xml代码
2.query analyzer效果如图:
我要吃饭了,可分词为“要吃”和“吃饭”。如果搜索“我要吃饭了”,solr应该把这两个词以OR的方式去搜索,结果却一厢情愿。
3.引用http://blog.chenlb.com/2010/08/get-solr-analysis-word.html
“这个问题的根本原因是 lucene / solr 使用的查询解析器生成的 Query 是短语查询。短语查询默认又是连续的词中没有其它字符。所以会找不到。
目前我知的方式大概有二种:
1、查询前分词一遍,把分出的词用空格分开,再去搜索(叫它为查询预处理)。查询前分词可以上面的接口。
2、扩展 solr query parser,返回 boolean query。”
4.使用方法1解决问题
即搜索前,先处理一下query analyzer的分词,然后再搜索。
solr分词的接口为:http://localhost:8080/solr/analysis/field?q=我要吃饭了
如果为多核配置,类似于http://localhost:8080/solr/核心名/analysis/field?q=我要吃饭了
结果返回:
最后,将分词列表组装成类似(要吃 OR 吃饭)的格式,就可以搜索到想要的结果。例如:
http://localhost:8080/solr/select/?q=(要吃 OR 吃饭)
schema.xml已配置query的中文分词器,但搜索的结果不尽如意,solr并没有按照分词来进行搜索。
比如搜索“我要吃饭了”,并没有把包含“吃饭”的文档给搜索出来。解决过程如下:
1.query analyzer使用IK,配置如下:
Xml代码
<analyzer type ="query" > <tokenizer class ="org.wltea.analyzer.solr.IKTokenizerFactory" isMaxWordLength="false" />
2.query analyzer效果如图:
我要吃饭了,可分词为“要吃”和“吃饭”。如果搜索“我要吃饭了”,solr应该把这两个词以OR的方式去搜索,结果却一厢情愿。
3.引用http://blog.chenlb.com/2010/08/get-solr-analysis-word.html
“这个问题的根本原因是 lucene / solr 使用的查询解析器生成的 Query 是短语查询。短语查询默认又是连续的词中没有其它字符。所以会找不到。
目前我知的方式大概有二种:
1、查询前分词一遍,把分出的词用空格分开,再去搜索(叫它为查询预处理)。查询前分词可以上面的接口。
2、扩展 solr query parser,返回 boolean query。”
4.使用方法1解决问题
即搜索前,先处理一下query analyzer的分词,然后再搜索。
solr分词的接口为:http://localhost:8080/solr/analysis/field?q=我要吃饭了
如果为多核配置,类似于http://localhost:8080/solr/核心名/analysis/field?q=我要吃饭了
结果返回:
<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> </lst> <lst name="analysis"> <lst name="field_types" /> <lst name="field_names"> <lst name="text"> <lst name="query"> <arr name="org.wltea.analyzer.lucene.IKTokenizer"> <lst> <str name="text">要吃</str> <str name="type">word</str> <int name="start">1</int> <int name="end">3</int> <int name="position">2</int> </lst> <lst> <str name="text">吃饭</str> <str name="type">word</str> <int name="start">2</int> <int name="end">4</int> <int name="position">3</int> </lst> </arr> </lst> </lst> </lst> </lst> </response>注意<lst name="query">元素下可能有filter。我们只需要解析以上的xml,就可以获取到分词列表了。
最后,将分词列表组装成类似(要吃 OR 吃饭)的格式,就可以搜索到想要的结果。例如:
http://localhost:8080/solr/select/?q=(要吃 OR 吃饭)
相关文章推荐
- 准备.Net转前端开发-WPF界面框架那些事,UI快速实现法
- UIView的常见属性
- 使用UICollectionView实现轮播图的思路
- 利用android提高的的insert,query,update,deleteAPI与execSql,rawQuery函数执行原生的插入,查询,更新,删除语
- Android UI源码解析
- sqoop2增量导入无法指定last value问题解决方法
- ARM Developer Stuite V1.2 (ADS)的设置
- UIView延迟效果做出动画/UIView动画块
- UIViewTranstion动画
- 拼图pintuer去掉响应式的方法
- AMQP――Advanced Message Queuing Protocol(高级消息队列协议)小结
- 用户界面(人机界面)
- 使用RequestBuilder与服务器通讯
- BEA-290074 <Deployment service servlet received file download request for file "security/SerializedSystemIni.dat". The file may exist, but download of this file is not allowed.>
- jsp之request对象
- UI自定义进度条控件
- CALayer和UIView的区别
- WWDC15 Session笔记 - Xcode 7 UI 测试初窥
- Android UI系列-----ImageView的scaleType属性
- POJ 1986 Distance Queries(离线tarjan-LCA)