为什么有特殊字符可用时,ElasticSearch无法搜索?

时间:2018-10-17 11:16:11

标签: tokenize elasticsearch-5 analyzer

我有一个具有以下配置的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
    }
  }
}

我在做什么错?

1 个答案:

答案 0 :(得分:0)

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

一些基本但重要的要点:

  • 在创建/索引索引/数据时,我们需要指定分析器和分词器。
  • 在指定的字符串即“ DL-1234170386456”中,特殊字符(即“-”)可用,默认情况下,ElasticSearch使用的是Standard Analyzer
  • Standard Analyzer包含Standard Tokenizer,它基于Unicode文本分段算法。

实际问题:

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

解决方案:

  • 我们需要指定包含Whitespace AnalyzerWhitespace Tokenizer
  • 只要遇到空格,它将拆分单词。因此,ElasticSearch会将String(“ DL-1234170386456”)保持原样,我们可以找到它。