1

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

query.contains(document.field_name)

示例: 1. field_name:"ab" 2. field_name:"ab c"

对于查询“ab d”,我只想找到第一项。

执行此操作的无效方法基本上是将查询和索引字段的所有子字符串生成为字符串。

是否可以使用现有功能在 Solr 中实现此类要求?如果不是,那么最有效的算法/方法是什么?

PS。似乎 google adwords 为查找添加进行了此类匹配。

4

2 回答 2

0

这是执行您要求的一种方法:

字段类型

<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将字段值拆分为单词。因此,使用您的示例,a b将拆分为单词aand b,并a b d拆分为a,bd. 我们设置catenateAll="1"generateWordParts="0"所以单个单词被丢弃,产生一个单词。ab成为ab和并成为。a_bdabd

查询分析器类似,但有细微差别。我们将值拆分为单词,除非我们不丢弃单词或将它们连接起来。相反,我们将单词传递给ShingleFilterFactory,它接受aandb并返回a, b, and ab

我们使用 shingles 而不是串联的原因是允许a b c匹配a bb c。如果你只想a b c匹配a b c,设置catenateAll="1"和删除 shingle 工厂。

使用此配置,a b将仅匹配aba b(而不是a b d)。此外,a b c将匹配a, b, c, a b, b c, 和a b c. 还应该注意的是ab会匹配a b。如果其中任何一个不是您想要的,您应该能够配置 shingle 和 word 过滤器工厂来完全满足您的需要。

编辑:这个答案的早期版本使用魔法值来标记值的开始和结束。事实证明这是不必要的;只需将这些值连接在一起就足以防止a b匹配a b d

编辑 2索引分析器修复):WhitespaceTokenizerFactory应该是KeywordTokenizerFactory. 此外,WordDelimiterFilterFactory应该有catenateAll="0".

于 2013-08-29T23:10:45.290 回答
0

我认为在单个 Solr 查询中可能很难做到这一点。如果我正确理解了您的问题,我想我会做的是对查询字符串进行标记,依次搜索每个标记,并将搜索结果与初始查询字符串进行比较。例如,假设您的查询字符串是“term1 term2 term3”。您将依次搜索以下每个术语:

/solr/index/select?q=term1

这可能会返回以下内容:

term1 term2 term4
term1 term2
term1 term2 term3

然后,您可以与您的初始查询(“term1 term2 term3”)进行比较,以查看它是否包含每个搜索结果。抱歉,如果以上内容没有帮助。

于 2012-09-13T02:24:18.477 回答