ElasticSearch 5.3 filterer char_filter。 pattern_replace无法正常工作

时间:2017-07-31 23:33:05

标签: elasticsearch elasticsearch-5

我有一个要求,我需要通过电话号码查询文档。用户可以在搜索查询字符串中输入括号和短划线等字符,并且应该忽略它们。所以,我创建了一个使用char_filter的自定义分析器,而char_filter又使用pattern_replace标记过滤器删除除了带有正则表达式的数字之外的所有内容。但似乎弹性搜索不会过滤掉非数字。以下是我想要做的一个示例:

1)创建索引

put my_test_index 
{
     "settings" : {
         "index": {
            "analysis": {
               "char_filter": {
                  "non_digit": {
                     "pattern": "\\D",
                     "type": "pattern_replace",
                     "replacement": ""
                  }
               },
               "analyzer": {
                  "no_digits_analyzer": {
                     "type": "custom",
                     "char_filter": [
                        "non_digit"
                     ],
                     "tokenizer": "keyword"
                  }
            }
        }
     }
   },
   "mappings" : {
       "doc_with_phone_prop" : {
           "properties": {
               "phone": {
                   "type": "text",
                   "analyzer": "no_digits_analyzer",
                   "search_analyzer": "no_digits_analyzer"
               }
           }
       }
   }
}

2)插入一个文档

put my_test_index/doc_with_phone_prop/1
{
    "phone": "3035555555"
}

3)在手机中没有任何括号或破折号查询

post my_test_index/doc_with_phone_prop/_search
{
    "query": {
        "bool": {
            "must": [
            {
                "query_string": {
                    "query": "3035555555",
                    "fields": ["phone"]
                }
            }]
        }
    }
}

这会正确返回一个文档:

{
   "took": 1,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 1,
      "max_score": 0.2876821,
      "hits": [
         {
            "_index": "my_test_index",
            "_type": "doc_with_phone_prop",
            "_id": "1",
            "_score": 0.2876821,
            "_source": {
               "phone": "3035555555"
            }
         }
      ]
   }
}

4)用括号查询不会返回任何内容,但我假设我的no_digits_analyzer会从搜索词中删除除数字之外的所有内容。

post my_test_index/doc_with_phone_prop/_search
{
    "query": {
        "bool": {
            "must": [
            {
                "query_string": {
                    "query": "\\(303\\)555-5555",
                    "fields": ["phone"]
                }
            }]
        }
    }
}

我在这里做错了什么?

我正在使用ElasticSearch 5.3。

感谢。

1 个答案:

答案 0 :(得分:0)

只需要阅读更多文档。显然,我使用错误的方式查询索引, query_string 不会转义特殊字符。我需要使用带有查询参数的multi_match。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html

以下查询有效并且应用了char过滤器

post my_test_index/doc_with_phone_prop/_search
{
    "query": {
        "bool": {
            "must": [
            {
                "multi_match": {
                    "query": "(303) 555- 5555",
                    "fields": ["phone"]
                }
            }]
        }
    }
}