【问题标题】:Can I have multiple filters in an Elasticsearch index's settings?我可以在 Elasticsearch 索引设置中有多个过滤器吗?
【发布时间】:2016-06-01 20:07:23
【问题描述】:

我想要一个简单存储功能“名称”的 Elasticsearch 索引。我希望能够分别发出语音查询和预先输入样式查询。我想我可以用两个分析器和两个过滤器创建一个索引;每个分析器都可以使用其中一个过滤器。但我似乎无法做到这一点。

这是我尝试使用的索引设置 json:

{
    "settings": {
        "number_of_shards": 1,
        "analysis": {
            "analyzer": {
                "autocomplete_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "ngram"]
                }
            },
            "analyzer": {
                "phonetic_analyzer": {
                    "tokenizer": "standard",
                    "filter": "double_metaphone_filter"
                }
            },
            "filter": {
                "double_metaphone_filter": {
                    "type": "phonetic",
                    "encoder": "double_metaphone"
                }
            },
            "filter": {
                "ngram": {
                    "type": "ngram",
                    "min_gram": 2,
                    "max_gram": 15
                }
            }
        }
    }
}

当我尝试使用这些设置创建索引时:

http://hostname:9200/index/type

我得到一个 HTTP 400,说

Custom Analyzer [phonetic_analyzer] failed to find filter under name [double_metaphone_filter]

别误会,我完全明白这句话的意思。我寻找并寻找错误的逗号或引号,但我没有看到任何内容。否则,一切都在那里并且格式正确。

如果我删除语音 analyzer,则会创建索引,但仅使用自动完成分析器和 ngram 过滤器。

如果我删除 ngram filter,索引会创建,但只能使用语音分析器和语音过滤器。

我感觉我缺少 ES 的基本概念,例如每个索引只有一个分析器,或者每个索引一个过滤器,或者我必须正确设置一些其他逻辑依赖项等。有 Elasticsearch 基础架构的逻辑图或完整的 API 规范,即任何索引都可以有 1..n 个分析器,只有 1 个过滤器,查询必须需要 bool、match 等中的任何一个。但是那个独角兽似乎不存在。

我看到了大量关于如何执行这些功能的文档、博客文章等,但索引上只有一个分析器和一个过滤器。我真的很想在一个索引上执行此双重功能(出于超出范围的原因)。

有人可以在这里提供一些帮助和建议吗?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您只是缺少设置对象的正确格式。您不能有两个 analyzerfilter 键,因为此设置映射对象中的每个键只能有一个值。提供过滤器列表似乎工作得很好。当您创建索引对象时,第二个键覆盖了第一个键。

    看这里:

    "settings": {
        "number_of_shards": 1,
        "analysis": {
            "filter": {
                "double_metaphone_filter": {
                    "type": "phonetic",
                    "encoder": "double_metaphone"
                },
                "ngram": {
                    "type": "ngram",
                    "min_gram": 2,
                    "max_gram": 15
                }
            },
            "analyzer": {
                "autocomplete_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "ngram"]
                },
                "phonetic_analyzer": {
                    "tokenizer": "standard",
                    "filter": "double_metaphone_filter"
                }
            }
        }
    }
    

    我下载了插件以确认此功能。 您现在可以使用有效负载在 _analyze 端点进行测试:

    {
        "analyzer":"autocomplete_analyzer",
        "text":"Jonnie Smythe"
    }
    

    【讨论】:

    • 拯救了我的一天。谢谢!
    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2012-07-08
    相关资源
    最近更新 更多