elasticsearch - 为具有模糊性的cross_fields构建有效的Elasticsearch查询

标签 elasticsearch fuzzy-search elasticsearch-query

我知道Elasticsearch在cross_fields查询中不支持multi_match类型的模糊性。我在使用Elasticsearch API时遇到了非常困难的时间,因此,我发现构建具有模糊字符串匹配功能的跨多个文档字段的相似查询非常困难。

我有一个名为papers的索引,具有各个字段,例如TitleAuthor.FirstNameAuthor.LastNamePublicationDateJournal等...我希望能够使用类似“John Doe纸标题2015期刊名称”的字符串进行查询。 cross_fields是完美的multi_match类型,但它不支持模糊性,这对于我的应用程序至关重要。

谁能建议一个合理的方法来解决这个问题?我花了数小时在SO和Elasticsearch论坛上浏览解决方案,但收效甚微。

最佳答案

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

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

对应:

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
      }
    }
  }
}

响应:
{
  "took" : 15,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.1027813,
    "hits" : [
      {
        "_index" : "my_fuzzy_index",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.1027813,
        "_source" : {
          "Title" : "Fountainhead",
          "Author" : [
            {
              "FirstName" : "Ayn",
              "LastName" : "Rand"
            }
          ],
          "PublicationDate" : "2015",
          "Journal" : "journal"
        }
      }
    ]
  }
}

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

让我知道这是否有帮助!

关于elasticsearch - 为具有模糊性的cross_fields构建有效的Elasticsearch查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658328/

相关文章:

elasticsearch - ElasticSearch中的“Join query”

.net - Nest (Geo)Location 的经度始终为 0?

elasticsearch - Elasticsearch字段的汇总和计数聚合

java - 在 Lucene-4.x 中将有效负载提升与 FuzzyQuery 结合使用

elasticsearch - Elasticsearch中的模糊查询是否与模糊逻辑相关?

algorithm - 如何用don't cares 模式匹配解决二维匹配问题?

elasticsearch - 如何在Elastic Search上更改搜索结果的顺序?

elasticsearch - Elasticsearch建议功能的前缀为like

python - elasticsearch 使用 python 客户端滚动

node.js - ElasticSearch-多次匹配查询,即使数据在那里也没有返回命中值-NodeJS