在 Elasticsearch 中搜索匹配全文查找未完成的单词,但未找到完整的单词

Search match fulltext find with uncomplete word but not found with complete word in Elasticsearch

提问人:Renato Cassino 提问时间:11/23/2022 更新时间:11/23/2022 访问量:26

问:

我在elasticsearch查询中遇到了一个非常奇怪的问题。我在我的网站上进行了自动完成搜索,但遇到了问题。

例如,在我的国家有一个叫做“Recreio dos Bandeirantes”的社区 当我搜索“bandeirant”(当用户输入时)查询找到邻域,但是,当完成时,类型“bandeirantes”找不到相同的邻域。

这是我的查询

      {
        query: {
          bool: {
            must: [
              {
                match: {
                  'city.name': city,
                },
              },
              {
                match: {
                  'city.state': state,
                },
              },
              {
                match: {
                  keyword: {
                    query, // The query is 'bandeirant' or 'bandeirantes'
                  },
                },
              },
            ],
          },
        },
        highlight: {
          fields: {
            keyword: {
              number_of_fragments: 9,
            },
          },
        },
        size: 20,
      }

最终邻域值为“Recreio dos Bandeirantes, Rio de Janeiro, RJ”

此字段的映射如下:

{
  "search-neighborhood-01": {
    "mappings": {
      "properties": {
        "city": {
          //.....
        },
        "keyword": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        },
        "name": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        }
      }
    }
  }
}

我在分析器中的设置

{
  "search-neighborhood-01": {
    "settings": {
      "index": {
        // .......
        "analysis": {
          "filter": {
            "autocomplete_filter": {
              "token_chars": [
                "letter"
              ],
              "min_gram": "1",
              "type": "edge_ngram",
              "max_gram": "10"
            }
          },
          "analyzer": {
            "autocomplete": {
              "filter": [
                "lowercase",
                "autocomplete_filter",
                "asciifolding"
              ],
              "type": "custom",
              "tokenizer": "standard"
            }
          }
        },
        // .....
      }
    }
  }
}

我的回应是bandeirant

// .....
      {
       //.....
        "_source": {
          "city": {
            "name": "Rio de Janeiro",
            "state": "RJ",
            "keyword": "Rio de Janeiro, RJ"
          },
          "name": "Recreio dos Bandeirantes",
          "keyword": "Recreio dos Bandeirantes, Rio de Janeiro, RJ"
        },
        "highlight": {
          "keyword": [
            "Recreio dos <em>Bandeirantes</em>, Rio de Janeiro, RJ"
          ]
        }
      }

我的回复是空的:/bandeirantes

我该怎么做才能解决这个问题?

谢谢 o/

Elasticsearch 搜索 自动完成 匹配

评论


答:

2赞 Kaveh 11/23/2022 #1

您之所以遇到此问题,是因为您的 Ngram 筛选器令牌具有配置,这意味着不会索引超过 10 的单词。"max_gram": "10"

我的建议是与配置一起增加此数量。“min_gram”

评论

1赞 Renato Cassino 11/23/2022
谢谢这个人:)我改成了 20 岁,就像一个魅力:)
0赞 Renato Cassino 11/23/2022 #2

我把max_ngram改成了20,:)