我知道Elasticsearch在cross_fields
查询中不支持multi_match
类型的模糊性。我在使用Elasticsearch API时遇到了非常困难的时间,因此,我发现构建具有模糊字符串匹配功能的跨多个文档字段的相似查询非常困难。
我有一个名为papers
的索引,具有各个字段,例如Title
,Author.FirstName
,Author.LastName
,PublicationDate
,Journal
等...我希望能够使用类似“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/