精确搜索字段使用Solr / Lucene的(Exact field search with sol

2019-10-17 05:34发布

我有文本字段。 而对于给定的查询,我想找到一个包含索引字段值的所有文档。

query.contains(document.field_name)

实施例:1. FIELD_NAME: “AB” 2. FIELD_NAME: “ABC”

对于查询“ABD”我只想要查找第一个项目。

没有有效的方式做到这基本上是产生的查询和索引字段作为一个字符串的所有子。

是否有可能使用existen功能,实现了Solr的这些要求? 如果没有什么是最有效的算法/办法做到这一点?

PS。 好像谷歌的AdWords做这样的一致的发现增加了。

Answer 1:

我想这可能是很难做到这一点在一个单一的Solr的查询。 如果我理解正确你的问题,我想我会做的是记号化的查询字符串,搜索反过来每个令牌,并比较与最初的查询字符串的搜索结果。 例如,假设您的查询字符串是“字词1字词2 TERM3”。 你会搜索每个反过来这些术语:

/solr/index/select?q=term1

这可能返回以下内容:

term1 term2 term4
term1 term2
term1 term2 term3

然后,您可以运行针对您的初始查询进行比较(“字词1字词2 TERM3”),看看它是否包含每个搜索结果。 道歉,如果上面是没有帮助的。



Answer 2:

这里是做什么你问一个方式:

字段类型

<fieldType name="exact" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="0" catenateAll="1" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="0" generateWordParts="1" catenateAll="0" />
    <filter class="solr.ShingleFilterFactory" outputUnigrams="true" outputUnigramsIfNoShingles="true" tokenSeparator="" maxShingleSize="99"/>
  </analyzer>
</fieldType>

说明:

该指数分析仪使用WordDelimiterFilterFactory分裂字段值成单词。 因此,使用你的榜样, ab被分成的话ab ,和abd被分成abd 。 我们设置catenateAll="1"generateWordParts="0" ,因此单个的单词被丢弃,从而产生一个单一的字。 ab成为ababd成为abd

该分析仪用于查询与细微的差别相似。 我们分裂值放入话,除了我们不放弃的话或将它们连接起来。 取而代之的是,我们通过话到ShingleFilterFactory ,它接受ab ,并返回abab

我们用,而不是串联带状疱疹的原因是为了让abc相匹配abbc 。 如果你想abc只匹配abc ,设置catenateAll="1" ,并删除了瓦厂。

使用该配置, ab将匹配仅ab ,和ab (未abd )。 此外, abc将匹配abcabbc ,和abc 。 还应当指出的是, ab将匹配ab 。 如果有任何这不是你想要的,你应该能够配置瓦和文字过滤器工厂做的正是你需要的。

编辑 :这个答案以前的版本放魔法值 ,以纪念价值的开始和结束。 原来,是不必要的; 只是串联的值加在一起,就足以防止ab从匹配abd

编辑2( 指数分析仪固定 ): WhitespaceTokenizerFactory应该已经KeywordTokenizerFactory 。 此外, WordDelimiterFilterFactory应该有catenateAll="0"



文章来源: Exact field search with solr/lucene