Solr / Lucene-以数字结尾的字符串的前缀查询

时间:2018-11-13 23:07:55

标签: solr lucene

我注意到一些我在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>.*"(用引号查询)

所有人都返回我认为应该的东西?

1 个答案:

答案 0 :(得分:2)

您的分析器根据UAX#29中指定的规则将字符串拆分为令牌。此处感兴趣的规则是WB6- WB12。它不会在一个句点(例如一个缩写)或数字组(例如一个十进制数字)之间拆分字母组,但是会拆分字母后跟数字(反之亦然)。

也就是说:

  • “ one.two”成为一个标记:“ one.two”。在doc1中,您将获得令牌:“ filea.txt”
  • “ 1.2”成为一个令牌:“ 1.2”
  • “ one.2”成为两个标记:“ one”和“ 2”。在doc2中,您将获得令牌:“ file1”和“ txt”
  • “ 1.two”成为两个标记:“ 1”和“ two”

要理解的另一件事是,通配符查询没有被标记化,因此它们将无法找到经过分析后会跨越两个标记的模式,或者在这种情况下,不会在标记化中消除字符。

因此,您的查询:

  • path:filea.*查找“ filea”。作为前缀。之所以找到它,是因为“ filea.txt”是索引中存在的令牌。
  • path:file1*查找“ file1”作为前缀。之所以找到它,是因为““ file1”是索引中的标记。
  • path:"file1.*"是短语查询,短语查询中没有通配符。因此,“ file1。*”经过分析,从而消除了标点符号,并变成了“ file1”,可以在索引中找到它。
  • path:file1.*查找“ file1”。作为前缀。 “ file1”和“ txt”在索引中,但“ file1”。不是,所以找不到任何东西。