solr - 使用尾随通配符进行搜索不会 return 预期结果

solr - search with a trailing wildcard does not return the expected results

我在 Solr 上索引了这个文档:

{
    "UUID": "4380",
    "QueryTerm": "stl3023",
    "Type": "unspecified",
    "HitCount": 1,
    "FieldName": "_suggest"
}

我正在尝试通过查询 QueryTerm 字段来检索此文档。

此字段在 schema.xml 文件中定义为:

<field indexed="true" name="QueryTerm" stored="true" type="textSplitConcat"/>
<fieldType class="solr.TextField" name="textSplitConcat" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter catenateAll="1" catenateNumbers="1" catenateWords="1" class="solr.WordDelimiterFilterFactory" generateNumberParts="0" generateWordParts="0" splitOnCaseChange="0"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

如果我 运行 使用这些参数进行查询:

q=QueryTerm:l3023*
qt=standard
fl=*
q.op=AND
wt=javabin
version=2

我没有得到任何结果。

但是如果我 运行 没有尾随 * 的查询,它会正确检索我需要的文档:

为什么会这样?尾随 * 不应该匹配 0 个或更多字符(如 here 所述)吗?

我正在使用 Solr 版本 4.8.1。

尾随的 * 是由 Web 应用程序自动添加的,我无法将其删除,因此我必须获取带有尾随 * 的文档。但是我可以在 schema.xml 文件中更改 Solr 的配置,如果它有任何帮助的话。


编辑#1

在@MatsLindh 的回答后,我尝试从 WordDelimiterFilter 切换到 NGramFilter:

<fieldType class="solr.TextField" name="textSplitConcat" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="256"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

但是当我 运行 带有尾随 * 的查询时,我仍然没有得到任何结果:

这是分析工具的截图:

我还是不明白。分析工具显示匹配,但查询没有 return 任何结果。我有什么不明白的?

相反,不带尾随通配符的查询仍然是 return 文档。


编辑#2

编辑 #1 之后,我没有重新索引我的内容,这就是问题所在。现在我已经完成了,Solr 通过查询 QueryTerm:l3023*.

正确地找到了我期望的文档

当您使用通配符时,大部分分析链都会被跳过(仅应用可识别多项式的过滤器 - 这意味着通常仅 LowercaseFilter)。

在您的情况下,WordDelimiterFilter 更改标记的方式是 没有 存储以 l3023 开头的标记。您可以使用 Solr 管理下的分析页面来查看传入文本的处理方式以及生成的令牌。

您的示例中的匹配内容是 3023 - stl 部分不会产生匹配(因为您的查询是针对 l3023 而不是 stl3023单词定界符过滤器的连接部分无关紧要(因为存储的标记是 stl3023,而不是 l3023

如果您想在标记内执行匹配,您可能需要查看生成 ngram。

PS:对于 8.x,您可能应该改用单词分隔符过滤器的图形过滤器版本。