当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch索引的设置中可以有多个过滤器吗?

牟慎之
2023-03-14

我想要一个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]

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

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

如果我删除ngram过滤器,则仅使用语音分析器和语音过滤器创建索引。

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

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

有人能提供一些帮助和建议吗?

共有1个答案

韦睿
2023-03-14

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

看这里:

"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"
            }
        }
    }
}

我下载了插件来确认这一点。现在,您可以使用有效负载在分析点进行测试:

{
    "analyzer":"autocomplete_analyzer",
    "text":"Jonnie Smythe"
}
 类似资料:
  • 问题内容: 我正在尝试建立一个查询,该查询将找到所有用户文档(docType =用户),然后根据许多过滤器对其进行过滤。例如位置,性别,年龄等。过滤器是根据我正在构建的搜索功能上的用户输入来添加/删除的。 以下没有结果: 以下返回结果: 后者虽然返回结果,但从长远来看是行不通的,因为我可能想为年龄,性别等添加一个额外的过滤器,而且我似乎无法添加多个字段。如果我删除位置过滤器,则第一个查询有效。 问

  • 问题内容: 假设我有: 每个产品都有属性。每个属性都有ID和一个值。我可以按属性筛选产品,但现在我要从MongoDB创建“可能的属性”列表。我想找到一种单独从ElasticSearch生成这样的列表的方法(也许只是向MongoDB查询其他数据)。 我需要的是: 这样的聚合看起来如何?获取所有可用属性(按分组)及其所有可能值(在所有产品中)? 问题答案: 您无法在一个查询中做到这一点,但在两个查询中

  • 问题内容: 假设我们在ElasticSearch索引中有一堆文档。每个文档 在一个数组中 都有多个位置,如下所示: 根据ElasticSearch参考指南 该过滤器可以针对每个文档使用多个位置/点。一旦单个位置/点与过滤器匹配,则文档将包含在过滤器中。 因此,是否可以创建检查数组中所有位置的地理距离过滤器? 不幸的是,这似乎不起作用: 抛出“ ”,因为它不是单个值,而是s 的数组。 问题答案: 您

  • 问题内容: 我在同一台Ubuntu服务器上有一个Rails 3应用程序的暂存和生产实例(使用tyre gem)。看来这两个实例都共享相同的elasticsearch索引,这显然不是我想要的。 如何使生产和登台实例使用单独的实例? 问题答案: 您需要覆盖索引名称。假设您要绑定ActiveRecord,它将根据相关模型创建索引名称。您可以使用这样的前缀来调整名称; 然后会创建一个名为的索引,以此类推。

  • 我可以用CURL设置breaker.fielddata限制,但不遵守config中的设置: ES版本:1.6.0 在我的节点配置中 /etc/elasticsearch/elasticsearch.yml 配置中将fielddata限制设置为60%(8G堆中的4.7G),但是: 我可以将indices.breaker.fielddata.limit更改为60% 为什么配置中的行形式不受尊重?

  • 问题内容: 我有一个带有3个索引的elasticsearch集群: 因此,现在我需要运行处理多个索引的查询。 例如: 获取在页面X中注册的用户的性别。 ( 要获取此信息,我需要来自多个索引的信息。 ) 这可能吗?也许整合Hadoop? 问题答案: 在Elasticsearch本身中,这非常容易!任何时候您指定索引时,都可以用逗号分隔其他索引。 您也可以使用_all搜索所有索引。 这是来自Elast