Solr并不总是用连字号分隔的术语

时间:2019-07-02 09:07:42

标签: solr

在查找索引中带有多个连字符/破折号/减号的术语时,我一直遇到一些问题。我最初在索引中有一个名为“带有两个连字符的文档”,可以通过查询"document-with two-hyphens"而不是"a document-with two-hyphens"找到该文档。

我通过列举短语“ a b c d e f”并在每个字母之间加短划线来简化了问题,即

  • a b c d e-f
  • a b c d-e f
  • a b c d-e-f
  • a b c-d e f
  • 依此类推...

理论上,对以上任何一项的搜索均应返回索引中的所有32个项目(例如,搜索"a b c d e f")。但是,上面的16个未能找到某些子集。

例如,搜索"a b c d-e f"找不到以下内容:

  • a b-c d-e f
  • a-b c d-e f
  • a-b-c d-e f
  • a b c d-e f

(即其中所有带有" d-e "的字词,包括查询字词

将查询斜率增加到2可以找到所有结果,但这似乎更像是一种破解。 Solr至少应在查询中找到与查询相同的项目,因为它们被相同地标记(请参见下文)。

任何人都可以解释此行为或如何对其进行“修复”吗?

对于普通查询,dismax或edismax,我们具有相同的行为。解析后的查询为:

"+DisjunctionMaxQuery((spanNear([title_de-de:a, title_de-de:b, title_de-de:c, spanOr([title_de-de:d-e, spanNear([title_de-de:d, title_de-de:e], 0, true)]), title_de-de:f], 0, true)))"

对索引/查询的分析如下:

Solr analysis of "a b c d-e f"

该类型的架构如下:

<fieldType name="text_default" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true" multiValued="false" omitNorms="true">
    <analyzer type="index">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_]]" replacement=" "/>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterGraphFilterFactory"
                generateWordParts="1" generateNumberParts="1" catenateWords="0"
                catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                splitOnNumerics="0" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
    <analyzer type="query">
        <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[\p{Punct}&amp;&amp;[^\-_\?\*]]" replacement=" "/>
        <tokenizer class="solr.WhitespaceTokenizerFactory" />
        <filter class="solr.WordDelimiterGraphFilterFactory"
                generateWordParts="1" generateNumberParts="1" catenateWords="0"
                catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"
                splitOnNumerics="0" preserveOriginal="1" />
        <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>

1 个答案:

答案 0 :(得分:0)

您缺少index time Flatten Graph Filter

  

WordDelimiterGraphFilter

     

此过滤器在单词定界符处分割标记。

     

如果在索引编制过程中使用此过滤器,则必须紧随其后的是“扁平图形过滤器”,以像词定界符过滤器那样将令牌彼此挤压,因为索引器无法直接使用图形。为了在拆分令牌时获得完全正确的位置查询,您应该在查询时使用此过滤器。