Solr的查询结果去重
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr的查询结果去重相关的知识,希望对你有一定的参考价值。
参考技术A Group将具有公共字段值的文档进行分组,并返回每个组的顶部文档(可以指定排序)。但是最终的结果是展示在 grouped 这个结果集中。Collapsing 和 Expand 组件结合起来,可以在 Solr 搜索结果中根据指定字段折叠,从而对文档分组去重的效果。
Collapsing常规用法是写在fq中,最简单的启用方式如下示例:
Collapsing功能是在每个shard搜索上进行折叠,但是在最终汇总结果时并没有再次按照相应的折叠方式进行合并,导致可能出现的情况就是同一个分组出现多次。
在索引数据时使用路由,使用折叠字段作为路由字段,这样就可以把具有相同值的文档索引到同一个分片(但是这样也有坏处,可能会导致索引数据分布不均,海量数据下影响不大)。
在创建collection时使用以下两个参数
带连字符的Solr查询返回零结果
我有一个索引文档,如下所示:
{"id:"abcde-efgr-jhik","domain": "http://www.play-bugs.com/index.com}
在域字段上,我使用text_general作为数据类型。
我试图查询这个文件使用
q=domain:play-bugs
如果我使用它,它不会返回任何结果
q=domain:play-bugs.com
它给了我预期的结果。我试图在“ - ”字符上使用“/”但没有运气。
编辑:
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
答案
这是使用Solr的Standard Tokenizer时的预期行为。
此标记生成器将文本字段拆分为标记,将空格和标点符号视为分隔符。除去分隔符字符,但以下情况除外:
- 未跟随空格的句点(点)将作为标记的一部分保留,包括Internet域名。
- “@”字符属于令牌分割标点符号集,因此电子邮件地址不会保留为单个标记。
请注意,单词以连字符分开。
当text_general
从输入流接收到domain
的内容时,它被标记为如下:
http://www.play-bugs.com/index.com => http | www.play |
bugs.com
| index.com
play-bugs => play | bugs
play-bugs.com => play |
bugs.com
您可以看到play-bugs.com
可以匹配bugs.com
,而play-bugs
则不能,因为当没有空格后,点不被视为分隔符。索引中没有令牌"bugs"
,因此即使查询q=domain:bugs
也不会匹配它。
您可以尝试使用另一个也在点上分割的标记生成器,或者添加像Word Delimiter Graph Filter这样的过滤器来正确分割生成的标记。
以上是关于Solr的查询结果去重的主要内容,如果未能解决你的问题,请参考以下文章