使用撇号的 Solr 搜索只能部分工作

  • 本文关键字:能部 工作 搜索 Solr solr
  • 更新时间 :
  • 英文 :


我正在尝试对包含名称的字段执行搜索。我试图弄清楚为什么我不能用撇号查询名称。如果我搜索"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>

任何帮助将不胜感激。

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

使用通配符进行查询时,不会进行大多数分析 - 这意味着要搜索的令牌与查询时不同。

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

解决方案是创建一个与您期望使用的通配符匹配的字段 - 在这种情况下,可能只有一个 WhitespaceTokenizer 和 Lowercase Filter 的字段(它应该与通配符一起使用,因为它是多术语感知的(。

预期对相同内容使用多个不同的字段,您可以使用copyField来确保将相同的内容索引到多个字段中,然后根据查询它们的方式进行不同的处理。这样,当您希望 Brien 与 O'Brien 匹配时,您可以搜索一个字段,而您可以将其用于通配符搜索,而情况可能并非如此。

最新更新