首页 > 解决方案 > 跨多个字段匹配 Elasticsearch 查询

问题描述

我有一堆产品存储在索引中。假设以下是单个产品的示例:

'productID' => 'sandbag'
'productName' => 'Bag of sand'
'productDescription' => 'A bag of sand'
'sizes' => array
    0 =>
        'sizeID' => '1wht'
        'sizeName' => '1 lb white'
    1 =>
        'sizeID' => '1blk'
        'sizeName' => '1 lb black'
    2 =>
        'sizeID' => '2wht'
        'sizeName' => '2 lb white'
    3 =>
        'sizeID' => '2blk'
        'sizeName' => '2 lb black'

一个黑色 1 磅的 ElasticSearch 查询会显示该产品。但是,黑色 1 磅沙子的查询没有。

如果我将所有空格替换为 AND 因此查询变为黑色 AND 1 AND lb AND sand,它就会出现,但这似乎会杀死引用的查询,例如"1 lb black" sand

我的 ElasticSearch 查询如下所示:

"query": {
    "query_string": {
        "query": "black 1 lb sand",
        "default_operator": "AND",
        "fields": ["productName", "sizes.sizeName"]
    }
}

最终目标是能够在一个查询中匹配尺寸和产品名称(以及我想要的任何其他内容),并在客户需要时支持引用的短语(“1 lb black”)。

我不想将操作员切换到 OR,因为这会带来太多产品。

帮助?

标签: elasticsearch

解决方案


在阅读完文档后,我自己设法弄清楚了这一点。在这里为将来遇到相同问题的其他人发帖。

只需将“类型”设置为“cross_fields”,详见https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html#multi-match-types

所以搜索查询变为:

"query": {
    "query_string": {
        "query": "black 1 lb sand",
        "default_operator": "AND",
        "type": "cross_fields",
        "fields": ["productName", "sizes.sizeName"]
    }
}

推荐阅读