当前位置: 首页 > 知识库问答 >
问题:

建立一种有效的具有模糊性的交叉字段弹性搜索查询

瞿宏儒
2023-03-14

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

我有一个名为papers的索引,它包含各种字段,如titleauthor.firstnameauthor.lastnamepublicationdatejournal等。我想能够查询一个字符串像“John Doe论文标题2015期刊名称”。cross_fields是完美的multi_match类型,但它不支持对我的应用程序至关重要的模糊性。

有谁能提出一个合理的方法来解决这个问题吗?我花了几个小时在SO和Elasticsearch论坛上研究解决方案,但收效甚微。

共有1个答案

郎吉星
2023-03-14

对于此场景,您可以使用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中并生