【问题标题】:ElasticSearch - Search analyzed and not_analyzed multi_field in one queryElasticSearch - 在一个查询中搜索已分析和未分析的多字段
【发布时间】:2013-09-20 22:01:29
【问题描述】:

我有一个值为“en sv”的索引字段“properties.language”。该字段有一个 multi_field 映射,由两个字段组成,一个已分析(名称“语言”),一个未分析(名称“_exact”)。

如何在不必同时查询“properties.language”和“properties.language._exact”的情况下发出单个搜索查询?

编辑:

这是我的配置:

索引数据:

{
    "_index": "51ded0be98035",
    "_type": "user",
    "_id": "WUzwcwhTRbKur7J5ZY_hgA",
    "_version": 1,
    "_score": 1,
    "_source": {
        "properties": {
            "language":"en sv"
        }
    }
}

“用户”类型的映射:

{
    "user": {
        "properties": {
            "properties": {
                "properties": {
                    "language": {
                        "type": "multi_field",
                        "fields": {
                            "language": {
                                "type": "string",
                                "analyzer": "standard",
                                "index": "analyzed"
                            },
                            "_exact": {
                                "type": "string",
                                "index": "not_analyzed"
                            }
                        }
                    }
                }
            }
        }
    }
}

搜索查询:

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [{
                        "or": [{
                            "term": {
                                "properties.language": "en sv"
                            }
                        }, {
                            "term": {
                                "properties.language._exact": "en sv"
                            }
                        }]
                    }]
                }
            }
        }
    }
}

【问题讨论】:

  • 您能粘贴您的设置(分析器)、映射和查询吗?仅通过描述很难判断您希望获得什么样的结果。
  • 我已经更新了问题。
  • 那么你总是想精确匹配en sv?如果是这样,那么您只需要在您的 _exact 字段上进行必须匹配。虽然,我猜这不是你遇到的问题......我很困惑你在查询中实际上想要完成什么。
  • 不,我希望能够同时匹配分析的文本和准确的文本。但我不想在查询中同时指定两者。 IE。以下查询应匹配:['en sv', 'sv', 'en']。我也想对确切的文本进行通配符搜索,但这是一个不同的问题......
  • 我很难理解为什么您需要对任何东西(通配符除外)进行完全匹配,除非您没有向我们提供所有要求。如果您只是使用沼泽标准映射并将“ev sv”发送给它。查询 ['en sv', 'sv', 'en'] 将全部匹配。然后将 not_analyzed 版本用于通配符。尽管有更快的方法来进行类似通配符的搜索。

标签: elasticsearch


【解决方案1】:

考虑使用 Elasticsearch 内置多值字段(即数组)来索引 language 字段:http://www.elasticsearch.org/guide/reference/mapping/array-type/。正如您目前所做的那样,将index 设置为not_analyzed

当索引您的数据时,而不是单个值 'en sv',而是传递 ['en', 'sv'],ES 会处理其余的事情。

对于查询,这使您能够执行以下操作以查找具有 ensv 的项目:

{
    "query": {
        "filtered": {
            "query": {
                "match_all": {}
            },
            "filter": {
                "bool": {
                    "must": [{
                        "term": {
                            "properties.language": "en"
                        }
                    }, {
                        "term": {
                            "properties.language": "sv"
                        }
                    }]
                }
            }
        }
    }
}

或者更好的是,使用terms 查询/过滤器而不是termhttp://www.elasticsearch.org/guide/reference/query-dsl/terms-query/ 找到更简洁/灵活的方法:http://www.elasticsearch.org/guide/reference/query-dsl/terms-query/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2021-12-13
    • 2014-02-25
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多