【问题标题】:How to choose appropriate analyzer in Elasticsearch如何在 Elasticsearch 中选择合适的分析器
【发布时间】:2017-05-12 13:16:11
【问题描述】:

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

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

3]部分匹配

我正在使用“ngram过滤器”如下,满足以上所有需求 但是,我将索引一个非常庞大的数据,其中包含“cmets”、“descriptions”等字段,其长度可能长达 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"
                            }
                        }
                    }
                ]
            }
        }
    }

谢谢!

【问题讨论】:

    标签: elasticsearch amazon-emr


    【解决方案1】:

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

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

    通常需要在搜索速度和磁盘使用量之间进行权衡。通常最好进行适当的预索引(n-gram 方法)以实现所需的性能

    【讨论】:

    • 感谢随机! ,我尝试使用通配符进行部分匹配,但匹配区分大小写,因此无法使用。我们可以对包含大约 150-200 个单词的字段使用 ngram 过滤器吗?
    • 你也可以试试query_string查询。但出于性能原因,最好继续使用 n-gram。它不应该带来太多开销,因为它们也是令牌而不是唯一的。因此,令牌本身只存储一次。并且令牌条目存储为引用,而不是整个字符串
    • 我已经发布了另一个具有相同上下文的问题,您能帮帮我吗? stackoverflow.com/questions/44300200/…
    • 会看看。顺便说一句,你为什么不接受这个问题的答案?
    • 谢谢@Random,我已经接受了之前的回答
    猜你喜欢
    • 2021-04-10
    • 2015-07-17
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2017-10-23
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多