弹性不匹配初始字符的多匹配查询

时间:2015-05-15 14:04:45

标签: elasticsearch

您好我正在尝试设置一个搜索框,可以对某些字段进行部分搜索,对其他字段进行标准搜索。我快到了,但未能克服以下障碍:

这是我的索引:

PUT /my_index
{
    "mappings": {
        "blogpost": {
            "properties": {
                "firstname": {
                    "fields": {
                        "autocomplete": {
                            "index_analyzer": "autocomplete",
                            "type": "string"
                        },
                        "firstname": {
                            "index_analyzer": "standard",
                            "type": "string"
                        }
                    },
                    "type": "string"
                }
            }
        }
    },
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "autocomplete": {
                        "tokenizer": "ngram_tokenizer",
                        "type": "custom"
                    },
                    "standard": {
                        "type": "standard"
                    }
                },
                "tokenizer": {
                    "ngram_tokenizer": {
                        "max_gram": "20",
                        "min_gram": "2",
                        "type": "nGram"
                    }
                }
            },
            "creation_date": "1431690991641",
            "number_of_replicas": "0",
            "number_of_shards": "3",
            "uuid": "W4Ug6IadS9mYuN5_Pqlhow",
            "version": {
                "created": "1040499"
            }
        }
    }
}

索引1文件:

PUT /my_index/blogpost/1
{"firstname" : "Albert"}

简单查询:

/_search?q=Albert

返回艾伯特。一切都好。

Multi_match查询:

{
  "query": {
    "multi_match": {
      "query": "Albert",
      "fields": [
        "firstname",
        "firstname.autocomplete"
      ]
    }
  }
}

也回归艾伯特。一切都好。

如果我用伯特取代阿尔伯特,那就回归艾伯特。一切都好。

但是" Al"或" al"或者" Alber"或" alber"才不是!任何包含开头字母的搜索都会失败。

然而

/my_index/_search?firstname.autocomplete:Al

一切都很好。

请帮忙。

1 个答案:

答案 0 :(得分:4)

field.autocomplete的搜索分析器是默认值,通常是standard

因此,当您搜索Al时,您实际上正在寻找“al”,即使是“Al”,您最终也会搜索小写版本。

然而,在使用自动完成分析器进行索引时,您没有将数据规范化为小写,因此索引中只有术语“Al”。

您可以使用analyze api检查数据的分析方式

GET /my_index/_analyze?field=firstname.autocomplete&text=Albert"

lowercase token filter添加到“自动填充”分析器应解决此问题:

   "autocomplete": {
                        "tokenizer": "ngram_tokenizer",
                        "type": "custom",
                        "filter" :[
                            "lowercase"
                        ]
                    },