【发布时间】:2019-08-07 17:46:20
【问题描述】:
我有一个简单的WhitespaceTokenizer 后跟WordDelimiterGraphFilter 的字段类型。这应该允许使用诸如“电子邮件”之类的词组查询来查找同时包含“电子邮件”和“电子邮件”的内容。但是,在某些情况下,这不起作用。
这可以通过由不同数量的连字符分隔的术语玩具数据集来重现:
- 一二三四
- 一二三四
- 一二三四
- 一二三四
- 等等……
该问题的旧版本使用 6 个单字符术语,a-b-c-d-e-f。
总共有 8 种组合(连字符的三个可能位置)。这意味着搜索上述任何一项都会找到全部 8 个。
但是,将找不到某些短语查询组合。例如,搜索“一二三四”会找到除自身之外的所有 7 个字词(另一方面,“二三四”有效)。
schema.xml中的fieldType如下:
<fieldType name="text_wrong" class="solr.TextField" positionIncrementGap="100" indexed="true" stored="true" multiValued="false" omitNorms="true">
<analyzer type="index">
<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.FlattenGraphFilterFactory" />
<filter class="solr.LowerCaseFilterFactory" />
</analyzer>
<analyzer type="query">
<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>
将查询斜率增加到 2 会找到所有结果,但也会找到其他不准确的类似结果(不良行为)。
也可以通过设置preserveOriginal=0来“修复”。但我不确定可能会对我们的搜索造成什么其他副作用,而且这似乎不是正确的行为。
分析如下:
如您所见,“四”的位置现在位于“4”位置,尽管它是“一二三四”中的第三个词。但这应该与查询中的位置相匹配(相同)。
这是正确的还是错误的?
【问题讨论】:
标签: solr