solr 中像[电脑 1.5]这种搜索词solr怎么获取命中几个词处理

输入指数词条名称
19520 个网友创建了 27695 个词库 共
你所在的城市:江苏省无锡市
皮肤、表情、词库合作
车载、企业版、Linux版合作:1. 字符串相似度
字符串相似度用于衡量2个字符串之间的相似度,这里的相似度一般指形式上的相似,而非语义上的相似。字符串相似度算法是模糊字符串匹配(搜索)的核心内容之一,在搜索引擎中的拼写检查、关键词智能补全中也发挥重要重要。在更高层次的实体链接(识别)或实体消歧应用中,也是重要的研究内容。
字符串的模糊匹配也叫模糊匹配,有点类似于正则表达式匹配,但是存在一些不同。字符串匹配(正则表达式)通常关注精确匹配,正则表达式描述的是精确的、没有二义性的字符串匹配,而模糊匹配更多关注的是相似度,近似、模糊、不精确。
模糊匹配需要回答类似下面的问题:
需要匹配多少字符?
在字符一样的情况下如何对字符顺序进行建模?
只在一个字符串中出现的字符如何处理?
是否某些字符比另一些字符更重要?例如开头的字符串更重要。
如何在单个字符与多个字符组合中进行选择和建模?
模糊匹配中的不同方法关注上述问题的不同方面。有些关注字符的重合度,有些则在字符顺序上更加关注,有些在字符组合(N元组)方面上进行建模。
1.1 字符重合度度量
字符重合度的2中度量方法:Jaccard距离,Jaro-Winkler距离。
Jaccard距离
又称相似系数,包含相同字符越多,两个字符串也越相似。具体计算时,使用相同字符串个数占总字符串个数(出现在两个字符串中)的百分比。
假设我们有以下两个词语:
总共出现了3个字符(中,国,人),而共有的2个字符(中,国),因此Jaccard距离为2/3。下图是一个更直观的解释:
在Jaccard系数的计算中,我们根据的是字符是否出现进行统计,字符之间一律平等对待,没有考虑相应的权重。但是事实上,每个字符对相似度的贡献是不一样的,例如开头的字符串可能贡献会大一些,出现次数多对相似度贡献也有所影响。当jaccard计算中, 考虑每个字符的不同权重时,相似度成为Tanimoto coefficient(谷本系数)。也就是说,Jaccard系数是Tanimoto系数的特例。TF-IDF值可以作为权重的一种形式。
jaro-Winkler距离
Jaccard系数没有考虑字符顺序对相似度的影响。因此在极端的情况下,两个顺序相反的字符串相似度为1。Jaro-Winkler在这一问题上做了一些改进。Lucence内置了一个实现org.apache.lucence.search.spell.JaroWinklerDistance。这种方法根据字符串长度将匹配限制在一个窗口中,并且考虑了相同字符是否出现在两个字符串的同一位置。
考虑字符串DIXON和DICKSONX:
上图中,深色的区域为匹配窗口。在这个区域内,总共有4个1,即4个匹配。字符串DIXON的长度为5,另一个长度为8.根据公式可以计算得到Jaro-Winkler系数为0.841。具体的公式及计算过程参考。
使用字符重合度来度量字符串相似度最大的问题是没有很好地考虑字符顺序,虽然Jaro-Winkler尝试做了一些改进。下面要介绍的编辑距离更正式地考虑了顺序这一因素。考虑顺序不可避免地使得计算性能下降,我们也会讨论一些提高计算性能的方法。
1.2 编辑距离
编辑距离,将一个字符串变成另一个字符串需要的操作次数。操作一般包括插入、删除、替换。因此编辑距离就是变换所需要的插入、删除、替换的最小次数。例如将tamming test转变为taming text需要删除m和替换x,编辑距离为2。插入、删除、替换操作的权重都一样的情况下,这种距离被称为Levenshtein距离。
归一化编辑距离
上述在考虑编辑距离的时候,我们没有考虑字符串长度。一个长度为10的字符串经过两次编辑后相同,跟一个长度为2的字符串经过两次编辑后相同,本质上是非常不同的。例如linktofarm与linktofrdd经过两次编辑后都成为linktofarm,而ab和cd经过两次编辑后也可以成为ab,因此编辑距离一样,说这两组字符串的相似度一样是很难说得通的。因此很有必要根据编辑后的长度进行归一化。
为了归一化到0-1,将两个字符串中长度较长的,减去编辑距离后再除以这个较长的长度。例如tamming test和taming text,较长的距离为12,减去编辑距离2,再除以12,得到归一化的值为0.833。再看一下刚才的两对字符串,归一化后的值分别为(10 - 2)/10=0.8和(2-2)/2=0。这是比较符合逻辑的,ab和cd根本没有什么相似度。
对编辑操作加权
一种Levenshtein的常见变型是Demerau-Levenshtein距离,这种计算方法引入了新的操作:调换相邻两个字符的位置,原本需要一个删除和一次插入的操作减少到一次。Levenshtein的实现在Lucence中也有一个优化过的版本org.apache.lucence.search.spell.LevenshteinDistance。在拼写检查中,两个元音字母的替换比两个辅音字母之间的替换更有可能发生,给予不同的权重是合理的。
1.3 n元组编辑距离
前面讨论到的方法都只涉及到单个字符,N元组编辑距离则允许使用多个字符进行比较。字符串开头的相似性往往会被特殊考虑。Lucence中N元组编辑距离的实现类为NgramDistance。
1.4 其他相似度度量方法
除了上述提到的集中计算方法外,还有很多方法用于计算字符串的相似。例如简单地使用最长字符串匹配,编辑距离的变形Damerau-Levenshtein,Q-Gram算法等。更多相似度算法可以参考。
1.5 Java字符串相似度计算:
字符串相似度的计算在不同语言中有非常多的实现,在Java中也有很多现成的方案。Solr和Lucence中自动了一些相似度算法实现。下面两个库也针对很多算法提供了实现:
2. 模糊匹配在Solr关键词提示的应用
搜索关键词提示或者建议几乎是搜索引擎的标配,除了减少用户输入外,能够引导用户到适合的关键词上,提升用户体验。下面的例子中,我们在Solr中实现一个关键字自动提示的例子。
Solr中的EdgeNGramTokenFilter在建立索引的时候,会根据配置将前缀也加入到索引中。例如taming这个词项在被索引时,ta、tam、tami等也会同时被索引。下面的Field类型声明展示了这种用法:
name="prefix" stored="false" indexed="true" class="solr.TextField"&
type="index"&
class="solr.WhitespaceTokenizerFactory"/&
class="solr.LowerCaseFilterFactory"/&
class="solr.EdgeNGramFilterFactory"
minGramSize="2" maxGramSize="10"/&
type="query"&
class="solr.WhiterspaceTokenizerFactory"/&
class="solr.LowerCaseFilterFactory"/&
相应的Field配置如下:
name="test" type="prefix" /&
name="prefixx" type="prefix" /&
source="test" dest="prefixx"/&
配置完后,加入两个文档:doctor和document,使用下面的查询测试一下效果:
http://localhost:8983/solr/select?q=prefixxdo&fl=test
在实际的产品应用中,前端需要配置JS的键盘事件来获取提示词,script.aculo.us是一个不错的库。更进一步,可以定制一个QueryResponseWriter返回前端需要的格式,例如返回li代码片段,自己定制的Writer需要在solrconfig中配置:
name="tah" class="me.lin.fuzzy.YourCustomResponseWriter" /&
name="/typeahead" class="solr.SearchHandler"&
name="defaults"&
name="wt"&tah&
name="defType"&dismax&
name="qf"& prefixx^1.0&
此时就可以通过下面定制的Handler来处理请求:
http://localhost:8983/solr/typeahead?q=tam
solr之~模糊查询
有的时候,我们一开始不可能准确地知道搜索的关键字在 Solr 中查询出的结果是什么,因此,Solr 还提供了几种类型的模糊查询。模糊匹配会在索引中对关键字进行非精确匹配。例如,有的人可能想要搜索某个前...
solr之模糊搜索(Fuzzy matching)
solr的模糊搜索主要有通配符,范围查询,近距离搜索等几类。下面分别探讨一下用法。1. 通配符查询通配符只是对单个term有效,对短语不起作用,ps:短语就是在查询条件上加双引号,比如 title:&...
solr模糊查询
今天重点讲模糊检索中文名字
solr对中文进行分词,如果不是一个词,可能会丢失字,然后在查询名字的,会感觉不太准确。
solr里面提供了很多查询匹配的方法例如:
1.使用*:resume...
Solr之精确、匹配、排序、模糊查询-yellowcong
Solr查询数据,其实下面一堆的参数,我也没有做测试,只是转载过来了,我大概只用了高亮、排序、查询、分页,其他的好像没有用过,以后用再来查...
在solrj中使用模糊查询
在solrj中使用模糊查询可以使用下面这种方法哦。在要查询的关键字前后加上*号,比如
”你好“。这样就可以把所有包含”你好“字段都查询出来了。
在solrj中可以这样使用:
SolrQuery ...
Solr6 多词匹配度查询搜索及排序的解决方案
操作系统:CentOS6.9
Solr版本:6.1,测试发现Solr6的都是可以的,7的没有试
数据有不同数据的类型(可以认为是不同数据库表,Solr中有一个字段专门用来标识...
Solr 6.0 学习(五)solr基本查询和高级查询
六、solr 查询参数说明
q - 查询字符串,这个是必须的。如果查询所有*:* ,根据指定字段查询(Name:张三
AND Address:北京)
fq - (filter query)过虑查询,作用:在q查询符...
没有更多推荐了,以前发布过的Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在上,欢迎改进。
HanLP中文分词solr插件支持Solr5.x,兼容Lucene5.x。
将和共两个jar放入${webapp}/WEB-INF/lib下
修改solr core的配置文件${core}/conf/schema.xml:
&&&fieldType&name=&text_cn&&class=&solr.TextField&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&&&!--&切记不要在query中开启index模式&--&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&false&/&
&&&&&&&/analyzer&
&&&/fieldType&
&&&!--&业务系统中需要分词的字段都需要指定type为text_cn&--&
&&&field&name=&my_field1&&type=&text_cn&&indexed=&true&&stored=&true&/&
&&&field&name=&my_field2&&type=&text_cn&&indexed=&true&&stored=&true&/&
Solr5中文分词器详细配置
对于新手来说,上面的两步可能太简略了,不如看看下面的step by step。本教程使用Solr5.2.1,理论上兼容solr5.x。
将上述两个jar放到solr-5.2.1/server/solr-webapp/webapp/WEB-INF/lib目录下。
首先在solr-5.2.1\bin目录下启动solr:
solr&start&-f
用浏览器打开,看到如下页面说明一切正常:
在solr-5.2.1\server\solr下新建一个目录,取个名字比如叫one,将示例配置文件solr-5.2.1\server\solr\configsets\sample_techproducts_configs\conf拷贝过来,接着修改schema.xml中的默认域type,搜索
&&&&&fieldType&name=&text_general&&class=&solr.TextField&&positionIncrementGap=&100&&
&&&&&&&&...
&&&&&/fieldType&
&&&&&!--&默认文本类型:&指定使用HanLP分词器,同时开启索引模式。
&通过solr自带的停用词过滤器,使用&stopwords.txt&(默认空白)过滤。
&在搜索的时候,还支持solr自带的同义词词典。--&
&&&&&fieldType&name=&text_general&&class=&solr.TextField&&positionIncrementGap=&100&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&&&filter&class=&solr.StopFilterFactory&&ignoreCase=&true&&words=&stopwords.txt&&/&
&&&&&&&&&!--&取消注释可以启用索引期间的同义词词典
&&&&&&&&&filter&class=&solr.SynonymFilterFactory&&synonyms=&index_synonyms.txt&&ignoreCase=&true&&expand=&false&/&
&&&&&&&&--&
&&&&&&&&&filter&class=&solr.LowerCaseFilterFactory&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&&&filter&class=&solr.StopFilterFactory&&ignoreCase=&true&&words=&stopwords.txt&&/&
&&&&&&&&&filter&class=&solr.SynonymFilterFactory&&synonyms=&synonyms.txt&&ignoreCase=&true&&expand=&true&/&
&&&&&&&&&filter&class=&solr.LowerCaseFilterFactory&/&
&&&&&&&/analyzer&
&&&&&/fieldType&
意思是默认文本字段类型启用HanLP分词器,text_general还开启了solr默认的各种filter。
solr允许为不同的字段指定不同的分词器,由于绝大部分字段都是text_general类型的,可以说这种做法比较适合新手。如果你是solr老手的话,你可能会更喜欢单独为不同的字段指定不同的分词器及其他配置。如果你的业务系统中有其他字段,比如location,summary之类,也需要一一指定其type=&text_general&。切记,否则这些字段仍旧是solr默认分词器,会造成这些字段“搜索不到”。
另外,切记不要在query中开启indexMode,否则会影响PhaseQuery。indexMode只需在index中开启一遍即可,要不然它怎么叫indexMode呢。
如果你不需要solr提供的停用词、同义词等filter,如下配置可能更适合你:
&&&fieldType&name=&text_cn&&class=&solr.TextField&&
&&&&&&&analyzer&type=&index&&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&true&/&
&&&&&&&/analyzer&
&&&&&&&analyzer&type=&query&&
&&&&&&&&&&&!--&切记不要在query中开启index模式&--&
&&&&&&&&&&&tokenizer&class=&com.hankcs.lucene.HanLPTokenizerFactory&&enableIndexMode=&false&/&
&&&&&&&/analyzer&
&&&/fieldType&
&&&!--&业务系统中需要分词的字段都需要指定type为text_cn&--&
&&&field&name=&my_field1&&type=&text_cn&&indexed=&true&&stored=&true&/&
&&&field&name=&my_field2&&type=&text_cn&&indexed=&true&&stored=&true&/&
完成了之后在solr的管理界面导入这个core one:
接着就能在下拉列表中看到这个core了:
上传测试文档
修改好了,就可以拿一些测试文档来试试效果了。hanlp-solr-plugin代码库中的src/test/resources下有个测试文档集合documents.csv,其内容如下:
1,你好世界
2,商品和服务
3,和服的价格是每镑15便士
4,服务大众
5,hanlp工作正常
代表着id从1到5共五个文档,接下来复制solr-5.2.1\example\exampledocs下的上传工具post.jar到resources目录,利用如下命令行将数据导入:
java&-Dc=one&-Dtype=application/csv&-jar&post.jar&*.csv
Windows用户的话直接双击该目录下的upload.cmd即可,Linux用户运行upload.sh。
正常情况下输出如下结果:
SimplePostTool&version&5.0.0
Posting&files&to&[base]&url&http://localhost:8983/solr/one/update&using&content-
type&application/csv...
POSTing&file&documents.csv&to&[base]
1&files&indexed.
COMMITting&Solr&index&changes&to&http://localhost:8983/solr/one/update...
Time&spent:&0:00:00.059
请按任意键继续.&.&.
同时刷新一下core one的Overview,的确看到了5篇文档:
是时候看看HanLP分词的效果了,点击左侧面板的Query,输入“和服”试试:
发现精确地查到了“和服的价格是每镑15便士”,而不是“商品和服务”这种错误文档:
这说明HanLP工作良好。
要知道,不少中文分词器眉毛胡子一把抓地命中“商品和服务”这种错误文档,降低了查准率,拉低了用户体验,跟原始的MySQL LIKE有何区别?
索引模式的功能
索引模式可以对长词进行全切分,得到其中蕴含的所有词汇。比如“中医药大学附属医院”在HanLP索引分词模式下的切分结果为:
中0&医1&药2&大3&学4&附5&属6&医7&院8&
[0:3&1]&中医药/n
[0:2&1]&中医/n
[1:3&1]&医药/n
[3:5&1]&大学/n
[5:9&1]&附属医院/nt
[5:7&1]&附属/vn
[7:9&1]&医院/n
开启indexMode后,无论用户搜索“中医”“中医药”还是“医药”,都会搜索到“中医药大学附属医院”:
目前本插件支持如下基于schema.xml的配置:
配置项名称
enableIndexMode
设为索引模式
enableCustomDictionary
是否启用用户词典
customDictionaryPath
用户词典路径(绝对路径或程序可以读取的相对路径,多个词典用空格隔开)
stopWordDictionaryPath
停用词词典路径
enableNumberQuantifierRecognize
是否启用数词和数量词识别
enableNameRecognize
开启人名识别
enableTranslatedNameRecognize
是否启用音译人名识别
enableJapaneseNameRecognize
是否启用日本人名识别
enableOrganizationRecognize
开启机构名识别
enablePlaceRecognize
开启地名识别
enableNormalization
是否执行字符正规化(繁体-&简体,全角-&半角,大写-&小写)
enableTraditionalChineseMode
开启精准繁体中文分词
对于更高级的配置,HanLP分词器主要通过class path下的hanlp.properties进行配置,请阅读以了解更多相关配置,如:
在Query改写的时候,可以利用HanLPAnalyzer分词结果中的词性等属性,如
String&text&=&&中华人民共和国很辽阔&;
for&(int&i&=&0;&i&&&text.length();&++i)
&&&&System.out.print(text.charAt(i)&+&&&&+&i&+&&&&);
System.out.println();
Analyzer&analyzer&=&new&HanLPAnalyzer();
TokenStream&tokenStream&=&analyzer.tokenStream(&field&,&text);
tokenStream.reset();
while&(tokenStream.incrementToken())
&&&&CharTermAttribute&attribute&=&tokenStream.getAttribute(CharTermAttribute.class);
&&&&//&偏移量
&&&&OffsetAttribute&offsetAtt&=&tokenStream.getAttribute(OffsetAttribute.class);
&&&&//&距离
&&&&PositionIncrementAttribute&positionAttr&=&kenStream.getAttribute(PositionIncrementAttribute.class);
&&&&//&词性
&&&&TypeAttribute&typeAttr&=&tokenStream.getAttribute(TypeAttribute.class);
&&&&System.out.printf(&[%d:%d&%d]&%s/%s\n&,&offsetAtt.startOffset(),&offsetAtt.endOffset(),&positionAttr.getPositionIncrement(),&attribute,&typeAttr.type());
在另一些场景,支持以自定义的分词器(比如开启了命名实体识别的分词器、繁体中文分词器、CRF分词器等)构造HanLPTokenizer,比如:
tokenizer&=&new&HanLPTokenizer(HanLP.newSegment()
&&&&&&&&&&&&&&&&&&&&.enableJapaneseNameRecognize(true)
&&&&&&&&&&&&&&&&&&&&.enableIndexMode(true),&null,&false);
tokenizer.setReader(new&StringReader(&林志玲亮相网友:确定不是波多野结衣?&));
技术问题请&,大家一起讨论,也方便集中管理。博客留言、微博私信、邮件不受理任何HanLP相关的问题,谢谢合作!
反馈问题的时候请一定附上版本号、触发代码、输入输出,否则无法处理。
Apache License Version 2.0
分享到: ()
我的开源项目解决solr搜索多词匹配度和排序方案
时间: 19:40:24
&&&& 阅读:2618
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&转载请标明出处:
本文主要介绍了在短语、句子、多词查询中,solr在控制查询命中数量、之后再对结果集进行排序。
默认是or 查询,也就是说:如果搜索q 中 分出来的词越多,所匹配的数量也就越多。如:搜索短语 &“中国联想笔记本” ,分词结果:中国 、联想 、 笔记本。&
覆盖结果集:只要文档中包含这3个任意词,都给返回。
排序结果:按照solr的打分公式。默认匹配相关度最高的文档放在第一位。。简单的说。就是文档中,同时含有&中国
、联想 、 笔记本 分值最高。这种需求一般可以满足部分的企业级搜索。
但是:如果需要自定义排序的话,问题就逐渐暴露了。
通过requestHandler&queryParser edismax 中的 df qf,通过字段的权重配置和 各个维度的积分模型之后,得出的排序。就不一定按照同时&含有&中国
、联想 、 笔记本优先级排序了。。有些只包含 中国 &这个词的优先级很高 也有可能。这种结果排序 明显不能理解和符合用户的意思。
如何合理的控制solr查询的命中的数量和质量???
在上篇文章中,提到了两种关于solr 对短语、短句(非关键词)的搜索精度解决方案,。
但是上面解决了返回精度的问题。但是设置mm匹配精度 或者全词匹配defaultOperator=“AND”。df和qf 自定义的排序 就不起作用了。
默认情况下,Solr查询语法只有两种形式:关键词或者以空格分隔的关键词组。当查询英文时,英文本身就是以空格来区分词的,所以Solr就能直接获取英文词并组装Query;但是中文句子中间没有空格,Solr查询时把整个句子交给Query,然后由Query再按照Field来分词、查询。这样就丧失了DisMax中qf所能带来的好处。&
所以:思考了这么一种思路。对“中国联想笔记本”分词之后。对每个词单元
中间接一个空格,就可以满足控制搜索词匹配度的前提下,提供自定义排序。这个时候就需要重写lucene的默认的queryParser 。
版本:solr4.10.3
solrconfig.xml代码
&span style=&font-size:14&&&str name=&defType&&myparser&/str&&/span&
&span style=&font-size:14&& &!-- 自定义queryParser --&
&queryParser name=&myparser& class=&com.lubanec.util.MyQParserPlugin&/&&/span&
重写QParserPlugin和DisMaxQParser
&span style=&font-size:14&&package com.lubanec.
import org.apache.solr.common.params.SolrP
import org.apache.solr.common.util.NamedL
import org.apache.solr.request.SolrQueryR
import org.apache.solr.search.QP
import org.apache.solr.search.QParserP
public class MyQParserPlugin extends QParserPlugin {
public void init(NamedList args) {
public QParser createParser(String qstr, SolrParams localParams,
SolrParams params, SolrQueryRequest req) {
return new MyQParser(qstr, localParams, params, req);
&span style=&font-size:14&&package com.lubanec.
import java.io.StringR
import org.apache.lucene.analysis.A
import org.apache.lucene.analysis.TokenS
import org.apache.lucene.analysis.tokenattributes.CharTermA
import org.apache.solr.common.params.SolrP
import org.apache.solr.request.SolrQueryR
import org.apache.solr.search.DisMaxQP
import org.slf4j.L
import org.slf4j.LoggerF
public class MyQParser extends DisMaxQParser {
private static Logger log = LoggerFactory.getLogger(MyQParser.class);
public MyQParser(String qstr, SolrParams localParams, SolrParams params,
SolrQueryRequest req) {
super(qstr, localParams, params, req);
Analyzer analyzer = req.getSchema().getQueryAnalyzer();
if (null == analyzer)
StringBuilder norm = new StringBuilder();
log.info(&before analyzer, qstr=& + this.qstr);
TokenStream ts = analyzer.tokenStream(req.getSchema().getDefaultSearchFieldName(), new StringReader(this.qstr));
ts.reset();
while (ts.incrementToken()) {
CharTermAttribute termAttribute = ts.getAttribute(CharTermAttribute.class);
System.out.println(termAttribute.toString());
norm.append(new String(termAttribute.toString())).append(& &);
ts.close();
} catch (Exception ex) {
log.info(&Ex=& + ex);
if (norm.length() & 0)
this.qstr = norm.toString();
log.info(&after analyzer, qstr=& + this.qstr);
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:&&&&&&&&&&&&原文地址:http://blog.csdn.net/hu/article/details/
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!博客分类:
Apache官网发布了solr6.6版本下载地址
solr6.6搜索环境搭建、IK中文分词同义词拼音solrj的使用
部署环境:Tomcat8
solr版本:6.6
解压solr,将目录\solr-6.6.0\server\solr-webapp下了webapp文件夹拷贝至
Tomcat的webapp目录下.改名为solr
将olr-6.6.0/server/lib/ext中所有jar包拷贝至\webapps\solr\WEB-INF\lib下,
将\solr-6.6.0\dist\solrj-lib下的noggit-0.6.jar拷贝至\webapps\solr\WEB-INF\lib下,
将olr-6.6.0/server/lib/中所有以metrics-开头jar包拷贝至\webapps\solr\WEB-INF
在WEB-INF下件新建classes文件夹,然后将\solr-6.6.0\server\resources中
log4j.properties拷贝至classes下.
将\solr-6.6.0\server目录下solr文件拷贝至任意位置.(我这里是G:\solrhome)改名
为solrhome.作为索引存放位置
在solrhome目录下,新建collection1文件夹,并将 /solr-6.6.0/server/solr/configsets/basic_configs
中conf文件夹复制到新建的collection1文件夹中.在collection1目录下新建data文件夹.
collection1中创建文件core.properties,写入内容
name=collection1
config=solrconfig.xml
schema=schema.xml
dataDir=data
回到Tomcat目录下,打开\webapps\solr\WEB-INF\web.xml文件.打开被注释的&env-entry&,
修改路径为solrhome的路径
&env-entry&
&env-entry-name&solr/home&/env-entry-name&
&env-entry-value&G:\solrhome&/env-entry-value&
&env-entry-type&java.lang.String&/env-entry-type&
&/env-entry&
将底部&security-constraint&注释掉;
访问 localhost:8080/solr/index.html
接下来就是配置IK中文分析器:
solr本身带有中文分词器,不过其不支持自己添加词汇,选用IK分词器,不过IK在2012年已经停止更新了,
但是这里附件提供了最新的IK支持.
将ik-analyzer-solr5-5.x.jar和solr-analyzer-ik-5.1.0.jar复制到\solr\WEB-INF\lib下,将IKAnalyzer.cfg.xml、ext.dic、stopword.dic
三个文件复制到\solr\WEB-INF\classes下ext.dic文件里为自定义的扩展词汇,
stopword为自定义的停用词
接下来开始定义
&fieldType name="text_ik" class="solr.TextField"&
&analyzer type="index"&
&tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" /&
&filter class="solr.LowerCaseFilterFactory" /&
&/analyzer&
&analyzer type="query"&
&tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory"
isMaxWordLength="false" useSmart="false" /&
&filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt"
ignoreCase="true" expand="true" /&
&filter class="solr.LowerCaseFilterFactory" /&
&/analyzer&
&/fieldType&
这个时候就可以测试一下是否成功了.
已经成功分词了..
针对企业级应用就要配置自定义的Field.此处不做详细描述.在
一般情况是根据实际情况分配.此示例仅供参考.
注意:需要对其中文分词提供搜索type属性必须为前面配置的IK名一样.
唯一索引id在solr中就叫ID并且是必须字段,所以不需单独配置
&!--product--&
&field name="product_name" type="text_ik" indexed="true" stored="true"/&
&field name="product_price"
type="float" indexed="true" stored="true"/&
&field name="product_description" type="text_ik" indexed="true" stored="false" /&
&field name="product_picture" type="string" indexed="false" stored="true" /&
&field name="product_catalog_name" type="string" indexed="true" stored="true" /&
&field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/&
&copyField source="product_name" dest="product_keywords"/&
&copyField source="product_description" dest="product_keywords"/&
用product_keywords作为默认的搜索域,搜索时联合product_name和product_description进行搜索
利用solr提供的客户端开始关联数据库.实现批量数据的导入.
&requestHandler name="/dataimport"
class="org.apache.solr.handler.dataimport.DataImportHandler"&
&lst name="defaults"&
&str name="config"&data-config.xml&/str&
&/requestHandler&
根据实际情况配置
&?xml version="1.0" encoding="UTF-8" ?&
&dataConfig&
&dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solrDemo"
user="root"
password="root"/&
&document&
&entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products "&
&field column="pid" name="id"/&
&field column="name" name="product_name"/&
&field column="catalog_name" name="product_catalog_name"/&
&field column="price" name="product_price"/&
&field column="description" name="product_description"/&
&field column="picture" name="product_picture"/&
&/document&
&/dataConfig&
solr-dataimporthandler-extras-6.6.0.jar复制到solr/
在solrhome\collection1\conf\
entity是data-config.xml里面的entity
如图,搜索房产,地产,不动产任意一个,则三个结果都会出现.
直接使用solr分词实现.就在原先IK配置上加上
&filter class="com.shentong.search.analyzers.PinyinTransformTokenFilterFactory" minTermLenght="2" /&
&filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="1" maxGram="20" /&
pinyinAnalyzer4.3.1.jar和pinyin4j-2.5.0.jar
修改后的属性介绍:
pinyin:属性是指全拼音,如重庆:chognqing,zhongqing默认为true,
isFirstChar:属性是指简拼.如重庆:cq,zq默认为都为TRUE则都有.
minTermLenght="2"至少为两个字符才转拼音,
minGram:这里配置的是2,因为如果1的话拼音简写会拆成单个字母,如重庆:cq,zq,c,z,q;
影响很严重;
&filter class="top.pinyin.index.solr.PinyinTokenFilterFactory" pinyin="true"
isFirstChar="true" minTermLenght="2" /&
&fieldType name="text_ik" class="solr.TextField"&
&analyzer type="index"&
&tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" /&
&filter class="solr.LowerCaseFilterFactory" /&
&filter class="top.pinyin.index.solr.PinyinTokenFilterFactory" pinyin="true" isFirstChar="true" minTermLenght="2" /&
&filter class="com.shentong.search.analyzers.PinyinNGramTokenFilterFactory" minGram="2" maxGram="20" /&
&/analyzer&
&analyzer type="query"&
&tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" isMaxWordLength="false" useSmart="false" /&
&filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" /&
&filter class="solr.LowerCaseFilterFactory" /&
&/analyzer&
&/fieldType&
结果如下: 但是:在开启高亮显示时进行搜索时发现,报错了.原因是solr的千古难题lucene默认的高亮机制会出问题.暂时没有解决办法,可能需要修改solr源码,
因为高亮显示的字段和搜索关键字长度不一致造成的,因为建立索引时一个关键字被索引成拼音和同义词,在搜索时使用拼音或同义词虽然查询出结果,
但是在高亮时回显的并不是拼音和同义词所以长度会不一致,同义词可以改成索引时不存储同义词,在query时查询时将关键字转换成多个同义词查询,
在回显时高亮的内容和关键字是匹配的所以不会出问题,如上是这样配置的.但却不能将拼音转汉字.所以只能选择简拼搜索,就是首字母那样长度是一致的
方案二:使用solrj工具将中文分词,之后利用pinyin4j将数据的拼音存储数据库,
用逗号隔开.建立Field,type选择text_general.它可以根据逗号拆分
并且不会将拼音再次拆分了.如果是中文的话就会把中文拆分成单个字.
此处就不演示了.此方法好处是便于维护,及对拼音进行处理和修改.
方案三:同义词,不推荐;
和solr-core-6.6.0.jar和solrj-lib文件夹下的jar包
(URL);发现这个方法已经过时,现在使用
HttpSolrClient httpSolrClient = new HttpSolrClient.Builder("URL").build();
注意:在使用查询的时候,需要对一些特殊字符转义,因为solr中很多特殊符号有着不同的意义,
那么可以直接调用
ClientUtils.escapeQueryChars(key);就可以返回转义后的字符串了.
HttpSolrClient httpSolrClient = new HttpSolrClient.Builder("http://localhost:8080/solr/collection1").build();
SolrQuery query = new SolrQuery();//获取查询
query.setQuery("关*");//设置搜索关键词,注意:因为使用了IK中文分词,有时单个字符搜索不会出现结果,那么就需要使用通配符*代替.
query.set("df", "product_keywords");//设置默认搜索域,前面定义的
query.set("fq", "product_price:[0 TO 20]");//设置筛选条件,可多个
query.setStart(0);//设置开始的条数
query.setRows(10);//设置显示条数
query.addSort("score", ORDER.desc); //设置排序方式,可添加多个排序方式,有顺序的优先级.score为默认的排序方式,会根据结果的符合度排序.
//若不设置默认为score,若设置别的排序.则不会默认score,和空参构造.有参构造同理.
query.setHighlight(true);//设置高亮
query.addHighlightField("product_name");//设置高亮的field.
query.setHighlightSimplePre("&font color='red'&");
query.setHighlightSimplePost("&/font&");
QueryResponse response = httpSolrClient.query(query);//执行查询.返回结果
long numFound = response.getResults().getNumFound();//查询总共条数
List&Map&String, Object&& resultList = response.getResults();//返回结果集
for (SolrDocument doc : resultList ) {
Map&String, Map&String, List&String&&& highlighting = response.getHighlighting();//获取高亮
List&String& productNames = highlighting.get((String) doc.get("id")).get("product_name");//取得高亮如果有,第一个值就是.这个地方和老版本不同,老版本是通过ID取,这里是通过ID的值区
下载次数: 169
(204.9 KB)
下载次数: 52
下载次数: 51
描述: 修改后的pinyin,支持多音,允许简拼和拼音同时存在
下载次数: 73
pinyinTokenFilter-1.1.0-jar源码呢?solr 7.1存在适配问题,不兼容啊。源码丢了,7.1还没试过
中文同义词有点问题,在analysis时能查询到同义词,但是真的去查询时,同义词是找到了,但是结果却没有,难道只有我一个人有这样的问题吗视具体情况而定,1.首先同义词建议少用,在solr中更确切的说法是等同词,所以在查询时是否查询关键字显示在了后面.2.如果是索引时使用同义词,没有被查询到的内容进行索引分析是否被建立了同义词索引.3.如果是索引时使用同义词,是否更改同义词后未重建索引& 如果是索引时使用同义词,可以在analysis中分析没有命中的数据具体分词情况
浏览: 4502 次
来自: 成都
&div class=&quote_title ...
&div class=&quote_title ...
pinyinTokenFilter-1.1.0-jar源码呢? ...
中文同义词有点问题,在analysis时能查询到同义词,但是真 ...
好好,值得收藏谢谢
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 solr否定词 的文章

 

随机推荐