首页 > 解决方案 > 为什么当特殊字符可用时 ElasticSearch 无法搜索?

问题描述

我有一个具有以下配置的 ElasticSearch 索引:

{
  "my_ind": {
    "settings": {
      "index": {
        "mapping": {
          "total_fields": {
            "limit": "10000000"
          }
        },
        "number_of_shards": "3",
        "provided_name": "my_ind",
        "creation_date": "1539773409246",
        "analysis": {
          "analyzer": {
            "default": {
              "filter": [
                "lowercase"
              ],
              "type": "custom",
              "tokenizer": "whitespace"
            }
          }
        },
        "number_of_replicas": "1",
        "uuid": "3wC7i-E_Q9mSDjnTN2gxrg",
        "version": {
          "created": "5061299"
        }
      }
    }
  }
}

我想用普通搜索搜索以下内容:

DL-1234170386456

此内容可在以下字段中找到:

DNumber

该文件的映射如下:

{
  "DNumber": {
    "type": "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}

我正在尝试用 JAVA 语言实现它。我遇到了 ElasticSearch 分析器和标记器,所以我使用了“空白”标记器。

我正在尝试使用以下查询进行搜索:

{
  "query": {
    "multi_match": {
      "query": "DL-1234170386456",
      "fields": [
        "_all"
      ],
      "type": "best_fields",
      "operator": "OR",
      "analyzer": "default",
      "slop": 0,
      "prefix_length": 0,
      "max_expansions": 50,
      "lenient": false,
      "zero_terms_query": "NONE",
      "boost": 1
    }
  }
}

我做错了什么?

标签: tokenizeelasticsearch-5analyzer

解决方案


经过大量研究和反复试验,找到了答案!

一些基本但重要的点:

  • 我们需要在创建/索引索引/数据时指定分析器和标记器。
  • 在指定的字符串,即“DL-1234170386456”中,特殊字符(即“-”)可用,ElasticSearch 默认使用标准分析器
  • 标准分析器包含基于 Unicode 文本分割算法的标准标记器。

实际问题:

ElasticSearch 将字符串(“DL-1234170386456”)分成两个不同的部分,如“DL”和“1234170386456”。

解决方案:

  • 我们需要指定包含Whitespace Tokenizer的Whitespace Analyzer
  • 每当遇到空格时,它都会拆分单词。因此,String ("DL-1234170386456") 将由 ElasticSearch 保持原样,我们能够找到它。

推荐阅读