【问题标题】:Search numbers using elastic search使用弹性搜索搜索号码
【发布时间】:2020-05-16 19:11:41
【问题描述】:

我有一些带有 id 属性的记录,所以我需要使用 Elasticsearch 搜索我的 id 字段。但是用户没有确切的 id,所以一旦用户尝试使用部分数字,如果它部分匹配应该返回结果。

例如,Id 是 1234,一旦我输入 12 应该返回这条记录 知道如何为数字值执行包含 (*) 行为的字符串吗?

【问题讨论】:

    标签: elasticsearch elasticsearch-query


    【解决方案1】:

    如果您关心前缀搜索,即 id 1234,仅当用户开始搜索 12 时,它应该返回 id 而不是 23,那么它的性能会更高,并且可以使用perfix query 在 Elasticsearch 中。

    如果你想要1234,即使用户错过了开始字符并搜索23,那么你可以需要使用n-gram tokenizer创建一个自定义分析器,它将创建像1223这样的标记, 34, 123, 234 这样你也可以提供中缀搜索。

    注意:prefix queriesn-gram tokenizer 均不适用于数字字段。您需要将您的用户 ID 存储在文本字段中以使其正常工作。

    n-gram tokenizer 在评论中要求的工作示例

    索引定义

    {
      "settings": {
        "index.max_ngram_diff": 10,
        "analysis": {
          "filter": {
            "autocomplete_filter": {
              "type": "ngram",
              "min_gram": 1,
              "max_gram": 10
            }
          },
          "analyzer": {
            "autocomplete": { 
              "type": "custom",
              "tokenizer": "standard",
              "filter": [
                "lowercase",
                "autocomplete_filter"
              ]
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "uid": {
            "type": "text",
            "analyzer": "autocomplete",
            "search_analyzer" : "standard"
          }
        }
      }
    }
    

    索引示例文档

    {
        "uid" : "1234"
    }
    

    **搜索查询12 **

    {
        "query": {
            "match" : {
                "uid" : {
                    "query" : "12"
                }
            }
        }
    }
    

    结果

    "hits": [
                {
                    "_index": "intdata",
                    "_type": "_doc",
                    "_id": "1",
                    "_score": 0.45532417,
                    "_source": {
                        "uid": "1234"
                    }
                }
            ]
    

    同样,它会返回 2312334 等的结果

    【讨论】:

    • 非常感谢。n-gram 标记器有更好的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 2021-11-23
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多