首页 > 解决方案 > Elastic 中的搜索速度不依赖于分析器的使用

问题描述

我正在尝试在我的项目中使用弹性搜索。创建了索引

curl --location --request PUT 'http://localhost:9200/customers' --header 'Content-Type: application/json' --data-raw '{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 40,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "index": {
        "max_ngram_diff" : "37"
    }
  }
}'

添加了20万条记录,我在查询中搜索所有字段

curl --location --request GET 'http://localhost:9200/customers/_search?q=*2000018*' --header 'Content-Type: application/json'

最重要的是,如果我在没有解析器的情况下创建索引,那么速度保持不变,我在第一种情况下使用 ngram,原则上对工作速度感到满意,但决定确保这真的是因为它配置正确,但没有它,情况类似,事实证明它不会以任何方式影响,这意味着我有一些东西 - 我做错了什么

我试图在文档和类似问题中找到答案,但仍然无法弄清楚我做错了什么

我会很高兴得到任何帮助

标签: elasticsearch

解决方案


看起来您已经analyzer在零件中定义了唯一settings

您还需要在mappings零件中定义分析器。

您需要添加analyzer指向my_analyzer将在索引时使用的分析器的设置。

参考这个官方 ES 文档,了解更多analyzer


假设您要使用的字段ngramtitle。下面将是针对这种情况的修改后的索引映射 -

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "my_tokenizer"
        }
      },
      "tokenizer": {
        "my_tokenizer": {
          "type": "ngram",
          "min_gram": 3,
          "max_gram": 40,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    },
    "index": {
      "max_ngram_diff": "37"
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "my_analyzer"
      }
    }
  }
}

推荐阅读