如何在Elasticsearch中选择合适的分析器

时间:2017-05-12 13:16:11

标签: elasticsearch amazon-emr

我有一个要求,我需要使用以下标准执行搜索。

1]不区分大小写的匹配
2]特殊字符匹配

3]部分匹配

我正在使用" ngram filter"如下,满足上述所有需求 但是,我将索引一个非常庞大的数据,这些数据将包含" comments","描述"等字段。等长度可达150字。 从网上的参考文献我认为使用" ngram"过滤器将导致大量磁盘空间使用。 有没有其他方法可以满足上述要求

{
        "template": "*",
        "settings": {
            "analysis": {
                "filter": {
                    "ngram_filter": {
                        "type": "ngram",
                        "min_gram": 1,
                        "max_gram": 25
                    }
                },
                "analyzer": {
                    "case_insensitive": {
                        "tokenizer": "whitespace",
                        "filter": [
                            "ngram_filter",
                            "lowercase"
                        ]
                    },
                    "search_analyzer": {
                        "type": "custom",
                        "tokenizer": "whitespace",
                        "filter": "lowercase"
                    }
                }
            }
        },
        "mappings": {
            "incidents": {
                "dynamic_templates": [
                    {
                        "strings": {
                            "match_mapping_type": "string",
                            "mapping": {
                                "type": "string",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                },
                                "analyzer": "case_insensitive",
                                "search_analyzer": "search_analyzer"
                            }
                        }
                    }
                ]
            }
        }
    }

谢谢!

1 个答案:

答案 0 :(得分:1)

我猜搜索性能也很关键,在这种情况下你必须使用ngrams。但是你可以尝试减少最小的ngram大小。例如,如果可以通过一个或两个字母跳过匹配,则可以将min_gram设置为3甚至更高。它会略微减少磁盘使用量。

还可以使用wildcardquery_string查询进行部分匹配。第一个是区分大小写,第二个不是。在这种情况下,您不会有磁盘使用开销,但会显着降低性能。

它通常是搜索速度和磁盘使用之间的权衡。通常,做一个适当的预索引(n-gram方法)以获得所需的性能会更好