优化ElasticSearch聚合搜索建议

时间:2016-02-08 17:35:01

标签: elasticsearch analyzer

我正致力于实施自动填充字段,其中建议还包含匹配文档的数量。

我已经使用include过滤器的术语聚合实现了这一点。因此,例如,如果用户输入克莱斯勒'可能会生成以下查询:

{
    "size": 0,
    "query": {
        "bool": {
            "must": [
                ...
            ]
        }
    },
    "aggs": {
        "filtered": {
            "filter": {
                ...
            },
            "aggs": {
                "suggestions": {
                    "terms": {
                        "field": "prefLabel",
                        "include": "Chry.*",
                        "min_doc_count": 0
                    }
                }
            }
        }
    }
}

这很好,我能够获得我需要的数据。但是,我担心这不是很好地优化,并且在索引文档时可以做更多的事情。

目前我们有以下映射:

{
    ...
    "prefLabel":{
        "type":"string",
        "index":"not_analyzed"
    }
}

我想知道是否添加分析字段,如下:

{
    ...
    "prefLabel":{
        "type":"string",
        "index":"not_analyzed",
        "copy_to":"searchLabel"
    },
    "searchLabel":{
        "type":"string",
        "analyzer":"???"
    }
}

所以我的问题是:什么是最优的索引时间分析器呢? (或者,这只是疯了吗?)

1 个答案:

答案 0 :(得分:0)

我认为edge ngram tokenizer可以加快速度:

curl -XPUT 'localhost:9200/test_ngram' -d '{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "suggester_analyzer" : {
                    "tokenizer" : "ngram_tokenizer"
                }
            },
            "tokenizer" : {
                "ngram_tokenizer" : {
                    "type" : "edgeNGram",
                    "min_gram" : "2",
                    "max_gram" : "7",
                    "token_chars": [ "letter", "digit" ]
                }
            }
        }
    },
    "mappings": {
        ...
             "searchLabel": {
                 "type": "string",
                 "index_analyzer": "suggster_analyzer",
                 "search_analyzer": "standard"
             }
        ...
    }
}'