【问题标题】:Solr searches with apostrophes only works partially带有撇号的 Solr 搜索仅部分有效
【发布时间】:2018-05-25 19:10:58
【问题描述】:

我正在尝试对包含名称的字段执行搜索。我试图弄清楚为什么我不能用撇号查询名字。如果我搜索“O”,我会得到我期望的结果(例如 O'Brien、O'Farrell、O'Connell 等)。如果我搜索“O'Brien”这个名字,我会得到我期望的结果。但是,如果我搜索“O'B”或除全名以外的任何内容或仅搜索“O'”,则不会得到任何结果。 仅供参考,在前面的示例中,我实际上并没有包含双引号。有问题的字段使用以下字段类型(创建自定义类型以确保我可以搜索以 y 结尾的名称 - 没有它,我找不到“Icy”):

<fieldType name="trname" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <!-- Case insensitive stop word removal.
         enablePositionIncrements=true ensures that a 'gap' is left to
         allow for accurate phrase queries.
    -->
    <filter class="solr.StopFilterFactory"
            ignoreCase="true"
            words="stopwords.txt"
            format="wordset"
            />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

非常感谢任何帮助。

编辑:我刚刚注意到问题的标题完全错误!

【问题讨论】:

  • 那么您的查询是什么?我最初的猜测是您的 WordDelimiterFilterFactory 在' ("Non-alphanumeric characters (discarded): "hot-spot" → "hot", "spot"") 上拆分标记
  • 您好,根据我的示例,查询是 FirstName:O'Brien*、FirstName:O'B*、FirstName:O'Br* 等。首先有效,其他查询无效。
  • 当您通过通配符查询时,不会进行分析(multitermaware 过滤器除外,例如小写过滤器)。由于令牌被您的 worddelimterfactory(')拆分,因此在查询端不会有任何令牌匹配。创建一个没有单词分隔符过滤器的单独字段并使用它。

标签: solr


【解决方案1】:

使用通配符进行查询时,大多数分析都不会发生 - 这意味着您搜索的标记与查询时不同。

WordDelimiterFilter 将根据 ' 拆分标记,这意味着当您为内容编制索引时,您会为单词的每个部分获得单独的标记 - 即 OBrien。当您搜索时,不会发生这种拆分,Lucene 将尝试将单个标记 - O'Brien 与已编入索引的标记进行匹配。由于没有与O'Brien 匹配的标记(因为在索引时该术语被拆分为多个标记),所以您不会得到命中。

解决方案是创建一个与您希望使用的通配符匹配的字段 - 在这种情况下,可能是一个只有 WhitespaceTokenizer 和 LowercaseFilter 的字段(它应该与通配符一起使用,因为它是 multitermaware)。

使用具有相同内容的多个不同字段是正常的,您可以使用copyField 确保将相同的内容编入多个字段的索引,然后根据您查询它们的方式进行不同的处理。这样一来,当您希望 Brien 与 O'Brien 匹配时,您可以使用一个字段进行搜索,并且可以使用一个字段进行通配符搜索,但情况可能并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多