【问题标题】:Correct index for partial search in ElasticElastic 中部分搜索的正确索引
【发布时间】:2021-06-21 00:26:21
【问题描述】:

我有 3 个字段,ID、reference_id 和 postal_code。我希望能够使用这些字段进行搜索,例如:

如果 ID 是 ABCDEFGH,搜索 DEF 将显示它。 如果有邮政编码 29019 和 27829,搜索 2 将同时显示两者。搜索 29 将显示 29019

这是自动完成过滤器吗?或通配符过滤器?我在 Elastic 文档中读到,将 * 放在通配符过滤器值的前面和末尾是不好的,所以我想知道实现这一点的最佳过滤器是什么。

谢谢

【问题讨论】:

    标签: elasticsearch indexing filter wildcard


    【解决方案1】:

    您可以同时使用 ngram 和边缘 n-gram 分词器来实现您所需的用例。

    添加一个包含索引映射、索引数据、搜索查询和搜索结果的工作示例

    索引映射:

    {
      "settings": {
        "analysis": {
          "analyzer": {
            "ngram_analyzer": {
              "tokenizer": "ngram_tokenizer"
            },
            "edge_ngram_analyzer": {
              "tokenizer": "edge_tokenizer"
            }
          },
          "tokenizer": {
            "ngram_tokenizer": {
              "type": "ngram",
              "min_gram": 1,
              "max_gram": 10,
              "token_chars": [
                "letter",
                "digit"
              ]
            },
            "edge_tokenizer": {
              "type": "edge_ngram",
              "min_gram": 1,
              "max_gram": 10,
              "token_chars": [
                "letter",
                "digit"
              ]
            }
          }
        },
        "index.max_ngram_diff": 10
      },
      "mappings": {
        "properties": {
          "ID": {
            "type": "text",
            "analyzer": "ngram_analyzer"
          },
          "postal_codes": {
            "type": "text",
            "analyzer":"edge_ngram_analyzer"
          }
        }
      }
    }
    

    索引数据:

    {
      "postal_codes": "27829"
    }
    {
      "ID": "ABCDEFGH"
    }
    {
      "postal_codes": "29019"
    }
    

    如果ID是ABCDEFGH,搜索DEF就会显示出来。

    搜索查询:

    {
      "query": {
        "term": {
          "ID": "DEF"
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "66778583",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
              "ID": "ABCDEFGH"
            }
          }
        ]
    

    搜索 2 将显示两者

    搜索查询:

    {
      "query": {
        "term": {
          "postal_codes": "2"
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "66778583",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.18232156,
            "_source": {
              "postal_codes": "27829"
            }
          },
          {
            "_index": "66778583",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.18232156,
            "_source": {
              "postal_codes": "29019"
            }
          }
        ]
    

    搜索 29 将显示 29019

    搜索查询:

    {
      "query": {
        "term": {
          "postal_codes": "29"
        }
      }
    }
    

    搜索结果:

    "hits": [
          {
            "_index": "66778583",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.6931471,
            "_source": {
              "postal_codes": "29019"
            }
          }
        ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-02
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      相关资源
      最近更新 更多