我知道Elasticsearch不支持multi_match
查询中cross_fields
类型的模糊性。我在使用Elasticsearch API时遇到了一段非常困难的时间,因此我发现构建一个类似的查询具有挑战性,该查询使用模糊字符串匹配来搜索多个文档字段。
我有一个名为papers
的索引,它包含各种字段,如title
、author.firstname
、author.lastname
、publicationdate
、journal
等。我想能够查询一个字符串像“John Doe论文标题2015期刊名称”。cross_fields
是完美的multi_match
类型,但它不支持对我的应用程序至关重要的模糊性。
有谁能提出一个合理的方法来解决这个问题吗?我花了几个小时在SO和Elasticsearch论坛上研究解决方案,但收效甚微。
对于此场景,您可以使用copy_to
字段。基本上,您是将不同字段的所有值复制到一个新字段(以下详细信息中的my_search_field
)中,并且在该字段上,您可以使用简单的匹配查询通过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"
}
}
]
}
}
因此,您不必考虑对多个字段应用模糊查询,而是可以采用这种方法。这样您的查询就会简化。
如果有帮助就告诉我!
我使用的是ES版本5.6。我有一个像下面这样的文档存储在ES中。 我想搜索所有已“启用”的字段。 我尝试了以下查询,但都不起作用。 但是下面的查询起作用了 因此,看起来只匹配顶级字段,而不匹配嵌套字段。是否有任何方法可以查询包含在所有字段中的文本,包括嵌套字段。我不想显式指定嵌套字段名。我正在寻找一种全局搜索,我想在文档中的任何地方搜索“文本”。 谢了。
我还没有为索引创建任何显式设置。谢了。
我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢
我试图为一个业务场景制定一个查询,其中我们有一个名为“types”的嵌套字段类型(即类似于字符串的ArrayList)。下面是以“类型”作为字段之一的索引文档示例。 文件1:{“类型”:[{“标签”:“对话”,},{“标签”:“暴力”,},{“标签”:“语言”,}} 文档2:{“类型”:[{“标签”:“对话框”,}} 现在,要求搜索查询最多匹配字段值中的一个值,即如果用户搜索“对话框”,那么它应该
我正在使用spring数据elasticsearch和elasticsearch一起查询文档。我想对嵌套文档进行嵌套查询。 我有java版本: 而且 当我让spring数据进行映射时,我得到: 当我试图查询文档时,我遇到了经典的内部文档与嵌套文档的问题,它无法识别嵌套元素。 当我尝试更新映射以使用嵌套文档时,我得到“无法从非嵌套更改为嵌套”。 我是否应该告诉spring data es@Neste
我是弹性搜索新手,并且已经完成了类似mykong教程的基本教程 我对创建任何文档的一部分有疑问 创建操作示例插入包含 /mkyong/posts/1001和以下请求数据的新文档: 问题1:-ES是否会在上述文档的所有属性上创建反向索引,即默认情况下的标题/类别/已发布/作者,并提供全文搜索,还是需要明确提及? 问题2:-在上述示例中,我们已经有了唯一的\u id,即。如果我已经将其存储在DB中并生