1

有没有办法可以在整个文档上使用弹性 match_phrase?不仅仅是一个特定的领域。

我们希望用户能够输入带引号的搜索词,并在文档中的任何位置进行词组匹配。

{
    "size": 20,
    "from": 0,
    "query": {
        "match_phrase": {
            "my_column_name": "I want to search for this exact phrase"
        }
    }
}

目前,我只找到特定字段的短语匹配。我必须指定要在其中进行短语匹配的字段。

我们的文档有数百个字段,因此我认为在每个 match_phrase 查询中手动输入 600 多个字段是不可行的。生成的 JSON 将是巨大的。

4

2 回答 2

1

您可以使用类型为phrase 的多重匹配查询,该查询在每个字段上运行match_phrase 查询并使用最佳字段中的_score。请参阅短语和短语前缀。

如果未提供任何字段,则 multi_match 查询默认为 index.query.default_field 索引设置,而后者又默认为 *。这将提取映射中符合术语查询条件的所有字段并过滤元数据字段。然后组合所有提取的字段以构建查询。

添加带有索引数据、搜索查询和搜索结果的工作示例

指数数据:

{
    "name":"John",
    "cost":55,
    "title":"Will Smith"
}
{
    "name":"Will Smith",
    "cost":55,
    "title":"book"
}

搜索查询:

{
  "query": {
    "multi_match": {
      "query": "Will Smith",
      "type": "phrase"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "64519840",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.2199391,
        "_source": {
          "name": "Will Smith",
          "cost": 55,
          "title": "book"
        }
      },
      {
        "_index": "64519840",
        "_type": "_doc",
        "_id": "2",
        "_score": 1.2199391,
        "_source": {
          "name": "John",
          "cost": 55,
          "title": "Will Smith"
        }
      }
    ]
于 2020-10-25T02:52:13.500 回答
0

您可以在匹配查询字段参数中使用 *,它将搜索文档中的所有可用字段。但它会降低您的查询速度,因为您正在搜索整个文档

于 2020-10-25T06:37:38.757 回答