ElasticSearch-整个文档中的词组匹配?不只是一个特定领域

问题描述

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

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

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

目前,我只发现了针对特定字段的词组匹配。我必须指定字段以在其中进行短语匹配。

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

解决方法

您可以使用带有类型短语的multi-match query,该短语在每个字段上运行match_phrase查询,并使用最佳字段中的_score。参见词组和短语前缀。

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

添加包含索引数据,搜索查询和搜索结果的工作示例

索引数据:

{
    "name":"John","cost":55,"title":"Will Smith"
}
{
    "name":"Will Smith","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","_id": "2","_source": {
          "name": "John","title": "Will Smith"
        }
      }
    ]
,

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...