首页 文章

查询elasticsearch以使所有分析的ngram标记匹配

提问于
浏览
0

我使用nGram分析器(仅发出三克)来索引一些数据,以解决compound words problem exactly as described at the ES guide .

然而,这不会按预期工作:相应匹配查询将返回至少一个nGram-token(每个单词)匹配的所有文档 .

例:

让我们使用nGram分析器将这两个索引文档与单个字段一起使用:

POST /compound_test/doc/_bulk
{ "index": { "_id": 1 }}
{ "content": "elasticsearch is awesome" }
{ "index": { "_id": 2 }}
{ "content": "some search queries don't perform good" }

现在,如果我运行以下查询,我会得到两个结果:

"match": {
  "content": {
    "query": "awesome search",
    "minimum_should_match": "100%"
  }
}

由此构造的查询可以表示如下:

(awe OR wes OR eso OR ome) AND (sea OR ear OR arc OR rch)

这就是第二个文档匹配的原因(它包含“some”和“search”) . 它甚至会匹配包含令牌“som”和“rch”的单词的文档 .

我真正想要的是一个查询 each analyzed token must match (在最好的情况下取决于最小应该匹配),所以像这样:

"match": {
  "content": {
    "query": "awe wes eso ome sea ear arc rch",
    "analyzer": "whitespace", 
    "minimum_should_match": "100%"
  }
}

..没有实际创建“从手”查询/在客户端预分析它 .

可以在https://pastebin.com/97QxfaSb找到重现该行为的所有设置和数据

有可能吗?

1 回答

  • 1

    在写这个问题时,我意外地找到了答案:

    如果ngram分析器使用ngram过滤器生成三元组(如指南中所述),它将按照上述方式工作 . (我猜因为实际的令牌不是单个ngrams而是所有创建的ngrams的组合)

    要实现所需行为,分析器必须使用ngram标记器:

    "tokenizer": {
      "trigram_tokenizer": {
        "type": "ngram",
        "min_gram": 3,
        "max_gram": 3,
        "token_chars": [
          "letter",
          "digit"
        ]
      }
    },
    "analyzer": {
      "trigrams_with_tokenizer": {
        "type": "custom",
        "tokenizer": "trigram_tokenizer" 
      }
    }
    

    使用这种方式生成令牌将在对该字段进行排队时产生所希望的结果 .

相关问题