在Elasticsearch中查询以部分匹配搜索词中的每个单词

时间:2019-11-01 04:12:08

标签: elasticsearch

我有一个包含单词的标签数组。

tags: ['australianbrownsnake', 'venomoussnake', ...]

如何将其与以下搜索字词匹配: “棕色蛇”,“澳大利亚蛇”,“有毒”,“有毒棕色蛇”

我什至不确定这是否可行,因为我是Elasticsearch的新手。 帮助将不胜感激。谢谢。

编辑:我创建了一个ngram分析器,并添加了一个名为ngram的字段,如下所示。

properties": {
    "tags": {
      "type": "text",
      "fields": {
          "ngram": { 
            "type": "text",
            "analyzer": "my_analyzer"
          }
        }
    }

我尝试了以下查询,但是没有运气

"query": {
        "multi_match": {
          "query": "snake",
          "fields": [
            "tags.ngram"
          ],
          "type": "most_fields"
        }
      }

我的标签映射如下:

        "tags" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            },
            "ngram" : {
              "type" : "text",
              "analyzer" : "my_analyzer"
            }
          }
        },

我的设置是:

{
  "image" : {
    "settings" : {
      "index" : {
        "max_ngram_diff" : "10",
        "number_of_shards" : "1",
        "provided_name" : "image",
        "creation_date" : "1572590562106",
        "analysis" : {
          "analyzer" : {
            "my_analyzer" : {
              "tokenizer" : "my_tokenizer"
            }
          },
          "tokenizer" : {
            "my_tokenizer" : {
              "token_chars" : [
                "letter",
                "digit"
              ],
              "min_gram" : "3",
              "type" : "ngram",
              "max_gram" : "10"
            }
          }
        },
        "number_of_replicas" : "1",
        "uuid" : "pO9F7W43QxuZmI9vmXfKyw",
        "version" : {
          "created" : "7040299"
        }
      }
    }
  }
}

更新:

此配置应该可以正常工作。 我相信那是我的错。我搜索了错误的索引

1 个答案:

答案 0 :(得分:1)

您需要以想要搜索标签的方式为标签建立索引。对于诸如“棕色蛇”,“澳大利亚蛇”之类的查询来匹配您的标签,您需要将它们分成较小的标记。

默认情况下,elasticsearch将字符串通过其标准分析器进行索引。您始终可以创建自定义分析器来存储所需的字段。您可以创建自定义分析器,将字符串标记化为nGrams。您可以指定3-10的大小,以将“ australianbrownsnake”标签存储为类似以下内容:['aus','aust',...,'tra','tral',...]

然后,您可以修改搜索查询以使其与tags.ngram字段相匹配,您将获得所需的结果。 可以像这样创建tags.ngrams字段:

https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

使用ngram标记程序:

https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-edgengram-tokenizer.html

EDIT1:Elastic倾向于使用要匹配的字段的分析器来分析查询关键字。您可能不需要在nGrams中对用户查询进行标记化,因为在tag字段中应该存储有匹配的nGram。您可以在映射中指定标准search_analyzer