0

所以我遇到了这种情况,我们有很多文档的标题如 US-2343 或 FX-4321 ...。我使用雪球分析器作为索引的默认分析器,但是我遇到了这个奇怪的问题。

假设我有以下文档 US-4321、US-2343、US-2300 ... 当我搜索“us-2300”时,一个文档按预期显示(连字符在搜索中被转义)但是当我进行搜索时对于“us-23*”...什么都没有显示,但是如果我搜索“us 23*”(注意空格),那么 us-2343 和 us-2300 就会出现

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

4

2 回答 2

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查询。它可能更适合您的需求。

于 2012-10-18T02:47:40.690 回答
1

如果您使用分析 API,您会发现您的标题是如何分解为术语的。

我认为 US-4321 被索引为 us 和 4321。当您搜索“us 4321”(使用 QueryString 或 MatchQuery)时,它会找到所有 us 术语和所有 4321 术语。

要回答更多问题,最好了解有关您的查询的更多详细信息。

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

HTH 大卫

于 2012-10-18T03:01:34.973 回答