在查找索引中带有多个连字符/破折号/减号的术语时,我一直遇到一些问题。我最初在索引中有一个名为“带有两个连字符的文档”,可以通过查询"document-with two-hyphens"
而不是"a document-with two-hyphens"
找到该文档。
我通过列举短语“ a b c d e f”并在每个字母之间加短划线来简化了问题,即
理论上,对以上任何一项的搜索均应返回索引中的所有32个项目(例如,搜索"a b c d e f"
)。但是,上面的16个未能找到某些子集。
例如,搜索"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)))"
对索引/查询的分析如下:
该类型的架构如下:
<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}&&[^\-_]]" 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}&&[^\-_\?\*]]" 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>
答案 0 :(得分:0)
您缺少index time Flatten Graph Filter。
此过滤器在单词定界符处分割标记。
如果在索引编制过程中使用此过滤器,则必须紧随其后的是“扁平图形过滤器”,以像词定界符过滤器那样将令牌彼此挤压,因为索引器无法直接使用图形。为了在拆分令牌时获得完全正确的位置查询,您应该在查询时使用此过滤器。