如何在elasticsearch中匹配“prefix”而不是整个字符串?

时间:2016-05-31 04:46:17

标签: elasticsearch

我有索引文档,每个文档都有一个字段:“CodeName”,其值如下所示:

document 1 has CodeName: "AAA01"
document 2 has CodeName: "AAA02"
document 3 has CodeName: "AAA03"
document 4 has CodeName: "BBB02"

当我尝试在字段上使用匹配查询时:

query: {
"match": {
"CodeName": "AAA"
}
}

我希望得到“AAA01”和“AAA02”的结果,但相反,我得到一个空数组。当我传入“AAA01”(我输入整个内容)时,我得到一个结果。我如何使它更一般地匹配?我尝试使用“前缀”而不是“匹配”,我遇到了同样的问题。

“CodeName”的映射是“type”:“string”。

2 个答案:

答案 0 :(得分:0)

据我所知,您首先应使用nGram类型的标记化程序索引数据。

您可以查看详细信息in documentation

评论相关: 我熟悉使用elasticsearch的symfony方式,我们正在使用它:

indexes:
    search:
        client: default
        settings:
            index:
                analysis:
                    custom_index_analyzer:
                    type: custom
                    tokenizer: nGram
                    filter: [lowercase, kstem]
                tokenizer:
                    nGram:
                        type: nGram
                        min_gram: 2
                        max_gram: 20
    types:
        skill:
            mappings:
                skill.name:
                     search_analyzer: custom_index_analyzer
                     index_analyzer: custom_index_analyzer
                     type: string
                     boost: 1

答案 1 :(得分:0)

  

我希望得到“AAA01”和“AAA02”的结果

这不是Elastic Search所期望的。 ES使用您指定的标记生成器将您的字符串分解为标记。如果您没有指定任何标记器/分析器,则默认的标准标记器会在空格和连字符等上拆分单词。在您的情况下,标记存储为“AAA01”,“AAA02”等等。没有“AAA”这样的术语,因此你没有得到任何结果。

要解决此问题,您可以使用match_phrase_prefix查询或将匹配查询的类型设置为phrase_prefix。试试这段代码:

"query": {
        "match_phrase_prefix": {
           "CodeName": "AAA"
        }
    }

OR

"query": {
        "match": {
           "CodeName": {
               "query": "AAA",
               "type": "phrase_prefix"
           }
        }
    }

以下是文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html。还要注意max_expansions参数,因为根据您的数据,此查询有时会很慢。

请注意,对于此技术,您应该使用默认映射。你不要使用nGram。