首页 > 解决方案 > 按字符串长度搜索弹性查询

问题描述

{
    "query": {
      "bool": {
        "must": {
          "bool": {
            "must": [
              {
                "multi_match": {
                  "query": "FGTHSF-2124-6",
                  "type": "phrase_prefix",
                 "fields": [
                    "contact.name"
                  ]
                }
              },
              {
                "terms": {
                  "contact.id": [
                    "sdfwerwe",
                    "6789",
                    "4567",
                    "12345"
                  ]
                }
              }
            ],
            "should": [],
            "must_not": []
          }
        },
        "filter": {
          "bool": {
            "must": {
              "bool": {
                "must": [],
                "should": [],
                "must_not": []
              }
            }
          }
        }
      }
    }
  }

我有这个查询,如果我搜索它,我没有得到任何结果,因为最后一个字符是单个数字,但是如果我给出 3 位数字,它会搜索正确的记录...短语前缀查询的默认大小是否有,如果有,那么如何更改它。





我尝试给出默认运算符、前缀长度、最大扩展等。

标签: node.jselasticsearchgraphqlelasticsearch-query

解决方案


contact.name 将 search_analyzer 作为“标准”,将索引分析器作为“自动完成”(设置不可用)。您的问题是因为字段在索引和搜索时转换为不同的标记,因此它们不匹配。

通常,在索引时和搜索时应使用相同的分析器,以确保查询中的术语与倒排索引中的术语格式相同。

但是,有时在搜索时使用不同的分析器可能是有意义的,例如在使用 edge_ngram 标记器进行自动完成时。

前任。具有以下设置

"settings": {
    "analysis": {
      "filter": {
        "autocomplete_filter": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 3
        }
      },
      "analyzer": {
        "autocomplete": { 
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "autocomplete_filter"
          ]
        }
      }
    }
  },
  "mappings": {
  .....
 }

以下令牌将存储在索引中

GET index79/_analyze
{
  "text": "FGTHSF-2124-645",
  "analyzer": "autocomplete"
}

{
  "tokens" : [
    {
      "token" : "fgt",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "212",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "<NUM>",
      "position" : 1
    },
    {
      "token" : "645",
      "start_offset" : 12,
      "end_offset" : 15,
      "type" : "<NUM>",
      "position" : 2
    }
  ]
}

现在,当您搜索“查询”:“HSF-2124-6”时,它不会返回任何文档([“HSF”,“2124”,“6”]),因为 6 不存在于任何令牌中。要返回文档,您需要将“min_gram”更改为 1 以生成大小为 1、3 和 3(645=> 6 64 645) 的标记。

如果您不使用 edge gram,请添加自动完成定义

编辑1:

如果您将在快照中看到最小克大小为 5,最大克大小为 20。生成的最小令牌大小为 5,例如为这些生成的“Abhijeet”令牌将是“Abhij”、“Abhije”、“Abhijee”、“Abhjieet”。因此,任何小于 5 大小的文本都不会匹配前“Abhi”。在您的情况下,在 hyphen("-") 上拆分后获取文本,因此 6 不匹配。您需要更新索引设置并制作 min-gram:1。

脚步。1. 发布 /index80/_close

  1. 以下只是您设置中的一个示例,复制整个分析部分,更新 mingram 等 PUT 请求
PUT index80/_settings
{
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 1,
          "max_gram": 10,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  }


3. 发布 /index80/_open

在此处查看如何更新设置以获取更多信息。

注意:减小最小大小将导致创建额外的令牌并增加索引的大小。最小和最大克数的选择应基于您的查询文本大小


推荐阅读