【发布时间】: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