我注意到一些我在solr(7.5版)中无法解释的行为。我有两个文档,每个文档都包含一个具有完整文件路径的字段。
doc1: {
path: ["/home/kyle/filea.txt"]
},
doc2: {
path: ["/home/kyle/file1.txt"]
}
path:filea.*
,则正确返回doc1
。 path:file1*
,则正确返回doc2
。 path:"file1.*"
,则正确返回doc2
。 path:file1.*
,则不返回doc2
。 我在索引分析器和查询分析器上具有默认的TokenizerChain,并且该字段是多值的。
所以我的问题:solr / lucene在幕后做什么导致查询:
<string><number>.*
在以下其他通用情况下,不返回我期望的文档:
<string>.*
(无尾号),<string><number>*
(查询中没有点)"<string><number>.*"
(用引号查询)所有人都返回我认为应该的东西?
答案 0 :(得分:2)
您的分析器根据UAX#29中指定的规则将字符串拆分为令牌。此处感兴趣的规则是WB6- WB12。它不会在一个句点(例如一个缩写)或数字组(例如一个十进制数字)之间拆分字母组,但是会拆分字母后跟数字(反之亦然)。
也就是说:
要理解的另一件事是,通配符查询没有被标记化,因此它们将无法找到经过分析后会跨越两个标记的模式,或者在这种情况下,不会在标记化中消除字符。
因此,您的查询:
path:filea.*
查找“ filea”。作为前缀。之所以找到它,是因为“ filea.txt”是索引中存在的令牌。path:file1*
查找“ file1”作为前缀。之所以找到它,是因为““ file1”是索引中的标记。path:"file1.*"
是短语查询,短语查询中没有通配符。因此,“ file1。*”经过分析,从而消除了标点符号,并变成了“ file1”,可以在索引中找到它。path:file1.*
查找“ file1”。作为前缀。 “ file1”和“ txt”在索引中,但“ file1”。不是,所以找不到任何东西。