`

Elasticsearch 多字段搜索 (一) - 多个及单个查询字符串

阅读更多

 

原文链接:http://blog.csdn.net/dm_vincent/article/details/41800351

 

多字段搜索(Multifield Search)

本文翻译自官方指南的Multifield Search一章。

查询很少是只拥有一个match查询子句的查询。我们经常需要对一个或者多个字段使用相同或者不同的查询字符串进行搜索,这意味着我们需要将多个查询子句和它们得到的相关度分值以一种有意义的方式进行合并。

也许我们正在寻找一本名为战争与和平的书,它的作者是Leo Tolstoy。也许我们正在使用"最少应该匹配(Minimum Should Match)"来搜索ES中的文档。另外我们也可能会寻找拥有名为John而姓为Smith的用户。

在本章中我们会讨论一些构建多字段搜索的工具,以及如何根据你的实际情况来决定使用哪种方案。

 

 

多个查询字符串(Multiple Query Strings)

 

处理字段查询最简单的方法是将搜索词条对应到特定的字段上。如果我们知道战争与和平是标题,而Leo Tolstoy是作者,那么我们可以简单地将每个条件当做一个match子句,然后通过bool查询将它们合并:

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }}
      ]
    }
  }
}

bool查询采用了一种"匹配越多越好(More-matches-is-better)"的方法,因此每个match子句的分值会被累加来得到文档最终的_score。匹配两个子句的文档相比那些只匹配一个子句的文档的分值会高一些。

当然,你并不是只能使用match子句:bool查询可以包含任何其他类型的查询,包括其它的bool查询。我们可以添加一个子句来指定我们希望的译者:

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }},
        { "bool":  {
          "should": [
            { "match": { "translator": "Constance Garnett" }},
            { "match": { "translator": "Louise Maude"      }}
          ]
        }}
      ]
    }
  }
}

我们为什么将译者的查询子句放在一个单独的bool查询中?所有的4个match查询都是should子句,那么为何不将译者的查询子句和标题及作者的查询子句放在同一层次上呢?

答案在于分值是如何计算的。bool查询会运行每个match查询,将它们的分值相加,然后乘以匹配的查询子句的数量,最后除以所有查询子句的数量。相同层次的每个子句都拥有相同的权重。在上述查询中,bool查询中包含的译者查询子句只占了总分值的三分之一。如果我们将译者查询子句放到和标题及作者相同的层次上,就会减少标题和作者子句的权重,让它们各自只占四分之一。

设置子句优先级

上述查询中每个子句占有三分之一的权重也许并不是我们需要的。相比译者字段,我们可能对标题和作者字段更有兴趣。我们对查询进行调整来让标题和作者相对更重要。

在所有可用措施中,我们可以采用的最简单的方法是boost参数。为了增加titleauthor字段的权重,我们可以给它们一个大于1boost值:

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { 
            "title":  {
              "query": "War and Peace",
              "boost": 2
        }}},
        { "match": { 
            "author":  {
              "query": "Leo Tolstoy",
              "boost": 2
        }}},
        { "bool":  { 
            "should": [
              { "match": { "translator": "Constance Garnett" }},
              { "match": { "translator": "Louise Maude"      }}
            ]
        }}
      ]
    }
  }
}

以上的title和k字段的boost值为2。 嵌套的bool查询自居的默认boost值为k。

通过试错(Trial and Error)的方式可以确定"最佳"的boost值:设置一个boost值,执行测试查询,重复这个过程。一个合理boost值的范围在110之间,也可能是15。比它更高的值的影响不会起到很大的作用,因为分值会被规范化(Normalized)

 

 

单一查询字符串(Single Query String)

 

bool查询是多字段查询的中流砥柱。在很多场合下它都能很好地工作,特别是当你能够将不同的查询字符串映射到不同的字段时。

问题在于,现在的用户期望能够在一个地方输入所有的搜索词条,然后应用能够知道如何为他们得到正确的结果。所以当我们把含有多个字段的搜索表单称为高级搜索(Advanced Search)时,是有一些讽刺意味的。高级搜索虽然对用户而言会显得更"高级",但是实际上它的实现方式更简单。

对于多词,多字段查询并没有一种万能的方法。要得到最佳的结果,你需要了解你的数据以及如何使用恰当的工具。

了解你的数据

当用户的唯一输入就是一个查询字符串时,你会经常碰到以下三种情况:

最佳字段(Best fields)

当搜索代表某些概念的单词时,例如"brown fox",几个单词合在一起表达出来的意思比单独的单词更多。类似title和body的字段,尽管它们是相关联的,但是也是互相竞争着的。文档在相同的字段中应该有尽可能多的单词(译注:搜索的目标单词),文档的分数应该来自拥有最佳匹配的字段。

多数字段(Most fields)

一个用来调优相关度的常用技术是将相同的数据索引到多个字段中,每个字段拥有自己的分析链(Analysis Chain)。

主要字段会含有单词的词干部分,同义词和消除了变音符号的单词。它用来尽可能多地匹配文档。

相同的文本可以被索引到其它的字段中来提供更加精确的匹配。一个字段或许会包含未被提取词干的单词,另一个字段是包含了变音符号的单词,第三个字段则使用shingle来提供关于单词邻近度(Word Proximity)的信息。

以上这些额外的字段扮演者signal的角色,用来增加每个匹配的文档的相关度分值。越多的字段被匹配则意味着文档的相关度越高。

跨字段(Cross fields)

对于一些实体,标识信息会在多个字段中出现,每个字段中只含有一部分信息:

  • Person:first_name 和 last_name
  • Book:titleauthor 和 description
  • Address:streetcitycountry 和 postcode

此时,我们希望在任意字段中找到尽可能多的单词。我们需要在多个字段中进行查询,就好像这些字段是一个字段那样。


以上这些都是多词,多字段查询,但是每种都需要使用不同的策略。我们会在本章剩下的部分解释每种策略。

 

分享到:
评论

相关推荐

    es从行json文件中查询相关内容

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,常用于实时的全文检索、分析和存储。在版本5.6中,它已经具备了强大的数据处理能力,支持从各种数据源(包括JSON文件)中导入数据并进行高效查询。 ...

    多字段 模糊查询 不要分

    开发者还可以利用 Elasticsearch 这样的全文搜索引擎,它内置了丰富的模糊查询和同义词处理机制。 总的来说,模糊查询是提高用户体验和信息检索效率的关键技术。在多字段模糊查询中,通过对多个字段进行综合判断,...

    day07-Elasticsearch03day07-Elasticsearch03

    Elasticsearch是一个开源的全文搜索引擎,它以分布式、RESTful API、实时性、可扩展性和高可用性著称。在本教程"day07-Elasticsearch03"中,我们将深入探讨Elasticsearch的一些核心概念和技术,以帮助你更好地理解和...

    Split-由任意个全角或半角空格分隔开的任意长度的字符串

    4. **性能优化**:对于大量数据的查询,可能需要考虑性能优化,例如创建全文索引、使用IN操作符而不是OR连接多个条件,或者使用搜索引擎如Elasticsearch来提高查询效率。 5. **错误处理和边界情况**:在实现这个...

    ElasticSearch全部学习资料

    - **Head** (可选): 是一个用于管理 ElasticSearch 的浏览器插件,提供图形界面来查看索引、文档等信息。可以从 [elastic.github.io/head](https://github.com/elastic/head) 获取安装指南。 #### 二、Elastic...

    探索未知:在Elasticsearch中执行模糊查询

    4. **多租户**:支持多租户架构,允许多个用户或应用共享同一个Elasticsearch集群。 5. **全文搜索**:支持全文搜索功能,能够对文本内容进行索引和搜索。 6. **复杂查询**:支持多种查询类型,如布尔查询、范围查询...

    php7.4+ElasticSearch7.12.rar

    6. **多字段支持**:Elasticsearch可以处理多字段的复杂查询,比如组合多个条件,或者对不同字段进行加权评分,以优化搜索结果的排序。 7. **多国语言支持**:Elasticsearch有内置的语言分析器,如英文、法文、德文...

    Mastering ElasticSearch 2nd Edition

    Elasticsearch是一款基于Apache Lucene构建的开源搜索引擎,它提供了一个分布式的多用户能力的全文搜索引擎,基于RESTful web接口。它能够解决任何大小的项目需要的实时存储、搜索和分析数据。Elasticsearch是...

    ElasticSearch可扩展的开源弹性搜索解决方案.docx

    - **查询DSL**:将多个简单的查询封装为一个 JSON 对象发送给 ElasticSearch,便于执行复杂的搜索操作。 - **示例查询**: ```bash curl -X GET 'localhost:9200/library/book/_search?q=title:crime&pretty=true...

    Elasticsearch.Server.3rd.Edition

    - **查询分析**: 解析查询字符串中的参数,如搜索字段、排序规则等。 - **查询字符串参数**: 支持多种参数,如搜索字段、分页、排序等。 #### 11. Lucene 查询语法 - **Lucene 查询**: 支持丰富的查询语法,如布尔...

    ElasticSearch 相关小结1

    Elasticsearch 是一个基于 Lucene 的分布式、全文搜索引擎,广泛用于实时数据分析和大规模信息检索。以下是关于 Elasticsearch 的核心概念及其与关系型数据库 MySQL 的对比: ### Elasticsearch 数据层面的概念 1....

    Elasticsearch 演讲PPT

    Elasticsearch是一个基于Apache Lucene的开源全文搜索引擎,提供分布式、多用户能力,并通过RESTful接口进行交互。它不仅用于全文检索,还被广泛用于数据分析和实时搜索场景,特别是在云计算环境中,具有高可用性和...

    Python-ElasticSearch搜索查询的讲解

    Elasticsearch作为一个强大的分布式搜索和分析引擎,被广泛应用于各类应用场景中,例如日志数据分析、实时应用程序监控以及网站搜索等。其核心特性在于能够处理大量的数据并提供快速的搜索响应。本文将深入探讨如何...

    Elastic Search学习笔记

    Elasticsearch 是一个基于 Lucene 的搜索引擎,它提供了丰富的功能用于搜索、分析和存储数据。本篇学习笔记将围绕 Elasticsearch 的基本查询操作展开,包括前置过滤、查询与排序以及统计功能。 #### 二、查询基础 ...

    elasticsearch关于geo的文档.zip

    Elasticsearch是一个强大的全文搜索引擎,同时也提供了丰富的地理位置(Geo)处理功能。在Elasticsearch中,地理信息可以被表示为两种主要类型:`geo_point`和`geo_shape`。这两个类型使得存储、索引和查询地理位置...

Global site tag (gtag.js) - Google Analytics