弹球搜索中使用雪球分析器的连字符的奇怪问题

时间:2012-10-17 23:39:51

标签: elasticsearch

所以我有这种情况我们有很多文件都有像US-2343或FX-4321这样的标题....我使用雪球分析仪作为索引的默认分析器,但是我有这个奇怪的问题

说我有以下文件US-4321,US-2343,US-2300 ...... 当我搜索“us-2300”时,一个文档按预期显示(连字符在搜索中被转义)但是当我搜索“us-23 *”时...没有显示,但是如果我进行搜索对于“我们23 *”(注意空格)然后我们-2343和我们-2300出现

我试图理解为什么它会这样运作。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以使用Analyze API检查文档的编制方式。如您所见,您的文档被编入索引为两个令牌:us2343

$ curl "localhost:9200/your_index/_analyze?analyzer=snowball&pretty=true" -d "US-2343"   
{
  "tokens" : [ {
    "token" : "us",
    "start_offset" : 0,
    "end_offset" : 2,
    "type" : "<ALPHANUM>",
    "position" : 1
  }, {
    "token" : "2343",
    "start_offset" : 3,
    "end_offset" : 7,
    "type" : "<NUM>",
    "position" : 2
  } ]
}

当您搜索us-23*时,elasticsearch正在尝试查找包含以us-23开头的令牌的文档。这是因为未分析通配符表达式。如您所见,snowball解析器不会生成此类令牌,​​因此不会返回任何结果。当您搜索两个令牌us和前缀为23的令牌时,您会收到结果。

看看text_phrase_prefix query。它可能更适合您的需求。

答案 1 :(得分:1)

如果你使用Analyze API,你会发现你的标题如何被分解为术语。

我认为US-4321被编入索引为我们和4321.当您搜索“us 4321”(使用QueryString或MatchQuery)时,它会找到我们所有的条款和所有4321条款。

要回答更多问题,最好在查询中提供更多详细信息。

如果您的标题包含“ - ”并且在您的使用案例中很重要,则应使用其他分析器。 顺便说一句,使用通配符比使用ngram或edgengram分析器更昂贵(从性能POV)。

HTH 大卫