【问题标题】:multi match elastic search in multi word field多词字段中的多匹配弹性搜索
【发布时间】:2020-07-28 07:19:58
【问题描述】:

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

{ 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”(参见多词字段'model'),它不显示任何结果。为什么搜索到多工作领域不起作用?我错过了什么吗?请帮忙。

我的索引映射如下所示:

$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'
                    ]
                ]
            ]
        ];

【问题讨论】:

  • 能否也显示您的索引映射?
  • @Val 我已经编辑了帖子。

标签: elasticsearch


【解决方案1】:

为了让 multi_match 起作用,您需要将 model 字段更改为 text 而不是 keyword

对于 keyword 字段,您只能运行完全匹配,因为不会分析关键字字段值。

尝试更改为

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

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

【讨论】:

  • 谢谢。此外,我还必须做“fielddata”=> true。然后它起作用了。
  • 我不认为 fielddata 对于多重匹配是必需的,除非您还对该字段进行聚合或排序。
猜你喜欢
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 2015-08-02
相关资源
最近更新 更多