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,您可能应该改用单词分隔符过滤器的图形过滤器版本。
我在 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,您可能应该改用单词分隔符过滤器的图形过滤器版本。