多词领域的多匹配弹性搜索

时间:2020-07-28 07:19:58

标签: elasticsearch

例如,我在弹性搜索中有以下文档:

{ make: 'honda',
  model: 'civic 5-door'
  year: '2011'
}

{ make: 'honda',
  model: 'CIVIC TOURER 5-DOOR '
  year: '2011'
}

{ make: 'honda',
  model: 'JAZZ 5-DOOR'
  year: '2012'
}

{ make: 'mazda',
  model: 'some multi word name'
  year: '2012'
}

我想制作一个可以在所有三个字段中进行搜索的搜索栏。我尝试了以下查询:

$query = 'some query string'

        $results = $search->search([
            'index' => 'cars',
            'body' => [
                "query" =>[
                    'multi_match' => [
                        "query" => $query,
                        "type" => "cross_fields",
                        "analyzer"=> "standard",
                        "fields" => ['model', 'make', 'year']                        ]
                ]
            ]
        ]);

当我使用“ honda 2011”之类的搜索查询时,该查询返回结果(它与“ make”和“ year”中的查询词匹配),但是如果我只是键入“ civic”(请参见多字字段) '模型'),则不会显示任何结果。为什么对多工作领域的搜索不起作用?我想念什么吗?请帮忙。

我的索引映射如下:

$params = ['index' => 'cars'];

        $params['body'] = [
            'mappings' => [
                'properties' => [
                    'body_type' => [
                        'type' => 'keyword'
                    ],
                    'fuel_type' => [
                        'type' => 'keyword'
                    ],
                    'engine_size' => [
                        'type' => 'short'
                    ],
                    'make' => [
                        'type' => 'keyword'
                    ],
                    'model' => [
                        'type' => 'keyword'
                    ],
                    'dealership' => [
                        'type' => 'keyword'
                    ],
                    'transmission' => [
                        'type' => 'keyword'
                    ],
                    'colour' => [
                        'type' => 'keyword',
                    ],
                    'location' => [
                        'type' => 'geo_point'
                    ]
                ]
            ]
        ];

1 个答案:

答案 0 :(得分:0)

要使多重匹配有效,您需要将model字段更改为text,而不是keyword

使用keyword字段,您只能运行完全匹配,因为未分析关键字字段值。

尝试更改为

                'model' => [
                    'type' => 'text'
                ],

然后重新索引您的数据,您的查询将起作用。