跨多个字段匹配Elasticsearch查询

时间:2018-07-06 01:24:51

标签: 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 “沙子

我的ElasticSearch查询如下:

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

最终的目标是能够在一个查询中匹配大小和产品名称(以及我想要的任何其他名称),并在客户需要时支持带引号的短语(“ 1磅黑色”)。

我不想将运算符切换为OR,因为这样会带来太多的产品。

帮助?

1 个答案:

答案 0 :(得分:0)

阅读文档后,我设法自己弄清楚了。在这里发布给以后遇到相同问题的其他人。

只需在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"]
    }
}