我有一个要求,我需要通过电话号码查询文档。用户可以在搜索查询字符串中输入括号和短划线等字符,并且应该忽略它们。所以,我创建了一个使用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。
感谢。
答案 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"]
}
}]
}
}
}