[我知道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
字段。基本上,您是将来自不同字段的所有值复制到一个新字段(以下详细信息中的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
}
}
}
}
因此,您不必考虑在多个字段上应用模糊查询,而可以采用这种方法。这样,您的查询将得到简化。
让我知道是否有帮助!