如何调整分析器设置以允许edge_ngram搜索数字?

时间:2019-04-30 06:17:51

标签: javascript node.js elasticsearch

在地址字段的弹性搜索中输入查询时,我无法搜索数字,当我输入“ 11412”之类的数字时,即使存在具有该邮政编码的地址,也没有显示结果。

我尝试使用anaylzer设置来更改token_chars,包括无济于事的数字。以下是我的anaylzer设置,包括映射

SELECT table1.*
FROM table1
WHERE table1.day = date '2019-04-03' AND
     NOT EXISTS (SELECT 1
                 FROM table2
                 WHERE table1.id = table2.id AND
                       table1.timestamp >= table2.start_time AND
                       table1.timestamp <= table2.end_time
                 )

在下面的弹性搜索查询中使用数字时,我没有任何结果,但是使用单词和部分匹配单词的常规搜索可以工作,尝试使用数字“ 11412”,“ 1141”进行相同的行为

{
  "settings": {
    "analysis": {
      "analyzer": {
        "autocomplete": {
          "tokenizer": "autocomplete",
          "filter": [
            "lowercase"
          ]
        },
        "autocomplete_search": {
          "tokenizer": "lowercase"
        }
      },
      "tokenizer": {
        "autocomplete": {
          "type": "edge_ngram",
          "min_gram": 3,
          "max_gram": 20,
          "token_chars": [
            "letter",
            "digit"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "address": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "autocomplete_search"
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

您遇到的问题是因为您正在使用lowercase令牌生成器,该令牌生成器会在遇到非字母的字符时破坏令牌,因此没有数字将其转化为倒排索引。 / p>

将您的autocomplete_search分析器更改为此,它将起作用:

    "autocomplete_search": {
      "tokenizer": "standard"
    }