为具有模糊性的跨域构建有效的Elasticsearch查询

问题描述 投票:2回答:1

[我知道Elasticsearch在cross_fields查询中不支持multi_match类型的模糊性。我在使用Elasticsearch API时遇到了非常困难的时期,因此,我发现建立一个类似的查询来进行模糊字符串匹配来搜索多个文档字段具有挑战性。

我有一个名为papers的索引,其中包含TitleAuthor.FirstNameAuthor.LastNamePublicationDateJournal等各种字段。我希望能够使用类似“ John Doe的论文标题为2015年期刊名称”。 cross_fields是完美的multi_match类型,但不支持模糊性,这对于我的应用程序至关重要。

任何人都可以提出解决此问题的合理方法吗?我花了数小时在SO和Elasticsearch论坛上浏览解决方案,但收效甚微。

elasticsearch fuzzy-search elasticsearch-query
1个回答
0
投票

您可以在这种情况下使用copy_to字段。基本上,您是将来自不同字段的所有值复制到一个新字段(以下详细信息中的copy_to),并且在该字段上,您可以使用简单的my_search_field通过fuzziness参数执行模糊查询。

下面是示例映射,文档和查询的方式:

映射:

match query

样本文件:

PUT my_fuzzy_index
{
  "mappings": {
    "properties": {
      "my_search_field":{                    <---- Note this field
        "type": "text"
      },
      "Title":{
        "type": "text",
        "copy_to": "my_search_field"         <---- Note this 
      },
      "Author":{
        "type": "nested",
        "properties": {
          "FirstName":{
            "type":"text",
            "copy_to": "my_search_field"     <---- Note this 
          },
          "LastName":{
            "type":"text",
            "copy_to": "my_search_field"     <---- Note this 
          }
        }
      },
      "PublicationDate":{
        "type": "date",
        "copy_to": "my_search_field"        <---- Note this 
      },
      "Journal":{
        "type":"text",
        "copy_to": "my_search_field"        <---- Note this 
      }
    }
  }
}

查询请求:

POST my_fuzzy_index/_doc/1
{
  "Title": "Fountainhead",
  "Author":[
    {
      "FirstName": "Ayn",
      "LastName": "Rand"
    }
  ],
  "PublicationDate": "2015",
  "Journal": "journal"
}

响应:

POST my_fuzzy_index/_search
{
  "query": {
    "match": {
      "my_search_field": {                                  <---- Note this field
        "query": "Aynnn Ranaad Fountainhead 2015 journal",
        "fuzziness": 3                                      <---- Fuzzy parameter
      }
    }
  }
}

因此,您不必考虑在多个字段上应用模糊查询,而可以采用这种方法。这样,您的查询将得到简化。

让我知道是否有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.