- 浏览: 2152435 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是这时候它能给你返回,相似或相近的结果来帮助你校正。
举个例子,假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,但是它有可能返回在线电影,在线电视,在线观看等等一些词,这些,就用到拼写检查的功能了。
solr作为一种开源的搜索服务器,对拼写检查,也提供了良好的支持,那么下面笔者就来讲下关于solr4.3的拼写检查的配置,在这之前先说明一点,作为拼写检查用,为了提高校正的准确率,一般对校正的词,不要进行分词,所以用string就好了,拼写检查的配置主要是在solrconfig.xml里面配置.
1,拼写组件SpellCheckComponent配置
2,在SearchHandler /select里面配置
3,在SearchHandler /spell里面配置
按照上面3来,就可以快速配置好拼写检查功能了,其实笔者上面写的4步,其实只配置2,3步就可以了,另外的第4步用默认值就可以了,在这里把它写出来,只是让大家有个认识
拼写组件SpellCheckComponent它其实是核心的东西,在他的里面可以配置1至多个拼写检查器,启动的时候所有的检查器都会加载,这次笔者主要介绍的有2个拼写检查器,一个是默认的只对主索引做拼写校正,另外一个是自定义加载spellings.txt拼写检查库,带拼写校正索引库的检查器,其他的检查器各位道友想要使用的话就自己去看wiki了。
对于上面的代码,虽然可以加载多个校正器,但是在拼写检查时,只能指定特定的一个进行校正,那么为什么要配置多个校正检查器呢? 笔者个人感觉这个主要是方便在程序运行可以动态切换校正器。
在spellings.txt里面自定义的拼写检查词,注意编码的格式一定是要UTF-8无BOM的格式,这里面的词,会在solr服务启动时,自动创建spellcheckerFile文件夹并把内容加载到
SearchHandler /select这个检索请求里面的配置很重要,拼写检查是否启用就是在这里面配置,
SearchHandler /spell组件使用默认配置即可
至此,拼写检查功能已经配置完毕,可以用solr的UI页面进行主索引测试,也可以用spellCheckFile里面的副索引,测试,但是,一次只能使用一种校正方法
下面给出solrj代码
最后,笔者关于拼写检查还有一个问题没有搞清楚,就是使用spellings.txt里面的自定义词,检索时只能检索出长度大于2的词,希望各位看到此篇文章的读者也测试一下,找一下解决方法。
我搞错了, 可以了。 不过好像没有数据
没有Suggestion 数据, 是需要重建索引么? 重新 commit ?
我搞错了, 可以了。 不过好像没有数据
这个问题,我已经搞明白了,读过lucene部分源码,里面有限制。
是哪部分的源码?
这个问题,我已经搞明白了,读过lucene部分源码,里面有限制。
举个例子,假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,但是它有可能返回在线电影,在线电视,在线观看等等一些词,这些,就用到拼写检查的功能了。
solr作为一种开源的搜索服务器,对拼写检查,也提供了良好的支持,那么下面笔者就来讲下关于solr4.3的拼写检查的配置,在这之前先说明一点,作为拼写检查用,为了提高校正的准确率,一般对校正的词,不要进行分词,所以用string就好了,拼写检查的配置主要是在solrconfig.xml里面配置.
1,拼写组件SpellCheckComponent配置
2,在SearchHandler /select里面配置
3,在SearchHandler /spell里面配置
按照上面3来,就可以快速配置好拼写检查功能了,其实笔者上面写的4步,其实只配置2,3步就可以了,另外的第4步用默认值就可以了,在这里把它写出来,只是让大家有个认识
拼写组件SpellCheckComponent它其实是核心的东西,在他的里面可以配置1至多个拼写检查器,启动的时候所有的检查器都会加载,这次笔者主要介绍的有2个拼写检查器,一个是默认的只对主索引做拼写校正,另外一个是自定义加载spellings.txt拼写检查库,带拼写校正索引库的检查器,其他的检查器各位道友想要使用的话就自己去看wiki了。
<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <!-- 查询分析器,如果不指定的话,默认会使用field字段类型的分词器 --> <str name="queryAnalyzerFieldType">string</str> <!-- 默认的校正器,只对主索引库管用 --> <lst name="spellchecker"> <str name="name">default</str> <str name="field">my_word</str> <str name="classname">solr.DirectSolrSpellChecker</str> <str name="distanceMeasure">internal</str> <float name="accuracy">0.7</float> <int name="maxEdits">1</int> <int name="minPrefix">1</int> <int name="maxInspections">5</int> <int name="minQueryLength">4</int> <float name="maxQueryFrequency">0.01</float> </lst> <!-- 读取拼写检查库的索引进行校正可以,使用默认配置,取消注释即可 --> <lst name="spellchecker"> <str name="classname">solr.FileBasedSpellChecker</str> <str name="name">file</str> <str name="sourceLocation">spellings.txt</str> <str name="characterEncoding">UTF-8</str> <str name="spellcheckIndexDir">spellcheckerFile</str> </lst> </searchComponent>
对于上面的代码,虽然可以加载多个校正器,但是在拼写检查时,只能指定特定的一个进行校正,那么为什么要配置多个校正检查器呢? 笔者个人感觉这个主要是方便在程序运行可以动态切换校正器。
在spellings.txt里面自定义的拼写检查词,注意编码的格式一定是要UTF-8无BOM的格式,这里面的词,会在solr服务启动时,自动创建spellcheckerFile文件夹并把内容加载到
F:\eclipse10tomcat\webapps\solr\solr_home\collections\collection1\data\spellcheckerFile索引起来。
SearchHandler /select这个检索请求里面的配置很重要,拼写检查是否启用就是在这里面配置,
<requestHandler name="/select" class="solr.SearchHandler"> <!-- default values for query parameters can be specified, these will be overridden by parameters in the request --> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="df">text</str> </lst> <!-- 这行代码非常重要,如果没有这行,拼写检查,是不起作用的--> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
SearchHandler /spell组件使用默认配置即可
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> <lst name="defaults"> <str name="df">text</str> <str name="spellcheck.dictionary">direct</str> <str name="spellcheck">on</str> <str name="spellcheck.extendedResults">true</str> <str name="spellcheck.collate">true</str> <str name="spellcheck.collateExtendedResults">true</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
至此,拼写检查功能已经配置完毕,可以用solr的UI页面进行主索引测试,也可以用spellCheckFile里面的副索引,测试,但是,一次只能使用一种校正方法
下面给出solrj代码
public List<String> spellcheck(String word){ List<String> wordList=new ArrayList<String>(); SolrQuery query = new SolrQuery(); //query.set("q","name:ac"); //query.set("qt", "/spell"); //默认是主索引 query.set("q", "my_word:"+word+""); query.set("qt", "/select"); //query.set("spellcheck.build", "true");//遇到新的检查词,会自动添加到索引里面 //query.set("spellcheck.dictionary", "file");//使用副索引,checkSpellFile里面的进行使用 query.set("spellcheck", "true"); query.set("spellcheck.count", Integer.MAX_VALUE); // params.set("spellcheck.build", "true"); try { QueryResponse rsp = server.query(query); System.out.println("直接命中:"+rsp.getResults().size()); SolrDocumentList ss=rsp.getResults(); for(SolrDocument doc:ss){ System.out.println(doc.get("my_word")); } //…上面取结果的代码 SpellCheckResponse re=rsp.getSpellCheckResponse(); if (re != null) { for(Suggestion s:re.getSuggestions()){ List<String> list=s.getAlternatives(); for(String spellWord:list){ System.out.println(spellWord); // wordList.add(spellWord); } } // for(Collation s: spellCheckResponse.getCollatedResults()){ // System.out.println(s.toString()); // } } return wordList; } catch (SolrServerException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }
最后,笔者关于拼写检查还有一个问题没有搞清楚,就是使用spellings.txt里面的自定义词,检索时只能检索出长度大于2的词,希望各位看到此篇文章的读者也测试一下,找一下解决方法。
评论
6 楼
hpze2000
2014-07-16
hpze2000 写道
hpze2000 写道
按你这样配置了, 不行啊。
提示 unknown handler: /select
提示 unknown handler: /select
我搞错了, 可以了。 不过好像没有数据
没有Suggestion 数据, 是需要重建索引么? 重新 commit ?
5 楼
hpze2000
2014-07-16
hpze2000 写道
按你这样配置了, 不行啊。
提示 unknown handler: /select
提示 unknown handler: /select
我搞错了, 可以了。 不过好像没有数据
4 楼
hpze2000
2014-07-16
按你这样配置了, 不行啊。
提示 unknown handler: /select
提示 unknown handler: /select
3 楼
ainubis
2014-06-12
qindongliang1922 写道
RLMLover 写道
嗯的确是这样 而且 末尾匹配的话最多只能比设定词少2个 不然匹配不到就是说 solr内定了最少是 词长度-2 的词才能匹配到
这个问题,我已经搞明白了,读过lucene部分源码,里面有限制。
是哪部分的源码?
2 楼
qindongliang1922
2013-11-28
RLMLover 写道
嗯的确是这样 而且 末尾匹配的话最多只能比设定词少2个 不然匹配不到就是说 solr内定了最少是 词长度-2 的词才能匹配到
这个问题,我已经搞明白了,读过lucene部分源码,里面有限制。
1 楼
RLMLover
2013-11-28
嗯的确是这样 而且 末尾匹配的话最多只能比设定词少2个 不然匹配不到就是说 solr内定了最少是 词长度-2 的词才能匹配到
发表评论
-
最新版Solr6.2.1安装记录
2016-09-23 18:48 1983下载最新版Solr6.2.1 wget http:/ ... -
ElasticSearch+Solr几个案例笔记
2016-09-22 18:46 1902(一) 最大能索引字符 ... -
SolrCloud之Sharding路由介绍
2016-07-19 16:07 3378在Solr4.4之后,Solr提供了SolrCloud ... -
SolrCloud6.1.0之SQL查询测试
2016-07-12 11:21 2336Solr发展飞快,现在最 ... -
Lucene/Solr/ElasticSearch搜索问题案例分析
2016-06-23 18:08 1806最近收集的两个搜索 ... -
Lucene+Solr+ElasticSearch查询匹配优化
2016-06-01 19:37 2876当我们在处理搜索业务时候,需求往往是灵活多变的,有时候我们需 ... -
如何通过JMX远程监控Solr?
2016-05-23 16:07 1974有时候,我们在服务 ... -
如何实现Solr自定义评分查询
2016-05-12 17:49 4795(一)背景介绍 大多数时候我们使用lucene/solr ... -
浅谈Lucene中的DocValues
2016-05-10 19:12 7420前言: 在Lucene4.x之后, ... -
开源大数据索引项目hive-solr
2016-05-06 16:15 1910github地址:https://github.com/qi ... -
浅谈Solr和ElasticSearch建索引性能优化策略
2016-04-27 18:48 2165由于Solr和ElasticSearch ... -
如何使用Hive集成Solr?
2016-03-17 15:05 2787(一)Hive+Solr简介 Hive ... -
Solr中如何使用游标进行深度分页查询
2016-03-10 16:34 3760通常,我们的应用系统 ... -
Hbase+Solr实现二级索引提供高效查询
2016-02-18 18:28 7027接着上一篇介绍协处理 ... -
SolrCloud5.4.1集群实战(一)
2016-02-06 10:06 3820古时候,人们用一头牛 ... -
如何使用Spark大规模并行构建索引
2016-02-01 12:54 2666使用Spark构建索引非常简单,因为spark提供了更高级的 ... -
如何在Solr中实现多core查询?
2015-12-07 20:55 4061基于solr或者elasticsearch提供的多核,多索引 ... -
Solr配置maxBooleanClauses属性不生效原因分析
2015-12-02 14:12 2428上次已经写过一篇关于 ... -
Solr如何避免查询条件过多异常
2015-11-17 16:07 2844今天,需要查询一个东西,在q里面大概有900左右参数,使用so ... -
Solr中Group和Facet的用法
2015-10-14 19:40 4537先来看一下Group与Facet的 ...
相关推荐
solr4.3 分词器 把IKAnalyzer.jar放到solr\WEB-INF\lib下。
ik-analyzer-5.01-for solr4.3.jar
最新版solr4.3的IK分词器,中文分词效果良好!对付一般的大众分词没有问题
通过svn下载的源代码,放在solr的lucene目录下
最高版本的 solr 中文分词配置 , 小弟已经测试过了 里面的 jar 要到各官网上下载
通过svn下载的源代码,放在solr的lucene目录下
ik4solr4.3(不再维护,未来可能删除:请去 ) solr4.3的ik分词器(改了一些smart分词算法。使用maven编译),隔壁有我写的包 支持从solr自己的环境中获取自定义词典(使用solr的ResourceLoader,只需要把字典文件...
solr4.3.0中所有的jar包,稳定,快速搜索引擎
solr4.3相关的jar包,包含httpclient-4.3.4.jar、httpcore-4.3.2.jar、httpmime-4.3.1.jar、IKAnalyzer2012.jar、slf4j-api-1.6.6.jar、slf4j-log4j12-1.6.6.jar、solr-solrj-4.3.0.jar、zookeeper-3.4.5.jar等
tomcat7下实现solr4.3的部署与配置,配置中文服务器。通过solrj实现索引的创建,修改,删除,查询。并实现httpclienct创建、修改索引,检索信息等。
Solr4.3+Tomcat安装配置及二次开发使用说明 详细介绍各种solrj
lucene4.3.0+IK Analyzer2012FF
solr.warsolr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包solr.war包...
solr 4.3 + mmesg 1.9.1中文分词器的整合案例,并修复mmesg 1.9.1 的BUG,同时是使用多core
关于solr4.3solrcloud与zk+tomcat6.x集群,详细描述。
4.3 创建查询 51 4.4 使用 SolrJ 创建索引 52 4.5 Solrj包的结构说明 53 4.5.1 CommonsHttpSolrServer 53 4.5.2 Setting XMLResponseParser 53 4.5.3 Changing other Connection Settings 53 4.5.4 ...
3.1 solr的功能 3 3.2 solr术语 3 3.2.1 Auto-warming 3 3.2.2 Facet 3 3.3.3 Document 6 3.3.4 Field 6 3.3.5 IndexWriter 6 3.3.6 IndexSearcher 6 3.3.7 Directory 6 3.3.8 Segment 7 3.3.9 QueryParser 7 3.3.10...
solr
Solr 8.11.2是8.x系列的最后一个版本,新版本已经是9.0版本了。 1,什么是solr? Solr是一个独立的企业级搜索应用服务器,他对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务提供一定格式...
solr文档