`

Elasticsearch 全文搜索 (一) - 基础概念和match查询

阅读更多

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

 

翻译自官方指南的全文搜索一章

全文搜索(Full Text Search)

现在我们已经讨论了搜索结构化数据的一些简单用例,是时候开始探索全文搜索了 - 如何在全文字段中搜索来找到最相关的文档。

对于全文搜索而言,最重要的两个方面是:

相关度(Relevance)

查询的结果按照它们对查询本身的相关度进行排序的能力,相关度可以通过TF/IDF,参见什么是相关度,地理位置的邻近程度(Proximity to a Geo-location),模糊相似性(Fuzzy Similarity)或者其它算法进行计算。

解析(Analysis)

解析用来将一块文本转换成单独的,规范化的词条(Tokens),参见解析和解析器(Analysis and Analyzers),用来完成:(a)倒排索引(Inverted Index)的创建;(b)倒排索引的查询。

一旦我们开始讨论相关度或者解析,也就意味着我们踏入了查询(Query)的领域,而不再是过滤器(Filter)。

 

 

基于词条(Term-based)和全文(Full-text)

 

尽管所有的查询都会执行某种程度的相关度计算,并不是所有的查询都存在解析阶段。除了诸如bool或者function_score这类完全不对文本进行操作的特殊查询外,对于文本的查询可以被划分两个种类:

基于词条的查询(Term-based Queries)

类似termfuzzy的查询是不含有解析阶段的低级查询(Low-level Queries)。它们在单一词条上进行操作。一个针对词条Footerm查询会在倒排索引中寻找该词条的精确匹配(Exact term),然后对每一份含有该词条的文档通过TF/IDF进行相关度_score的计算。

尤其需要记住的是term查询只会在倒排索引中寻找该词条的精确匹配 - 它不会匹配诸如foo或者FOO这样的变体。它不在意词条是如何被保存到索引中。如果你索引了["Foo", "Bar"]到一个not_analyzed字段中,或者将Foo Bar索引到一个使用whitespace解析器的解析字段(Analyzed Field)中,它们都会在倒排索引中得到两个词条:"Foo"以及"Bar"

全文查询(Full-text Queries)

类似match或者query_string这样的查询是高级查询(High-level Queries),它们能够理解一个字段的映射:

  • 如果你使用它们去查询一个date或者integer字段,它们会将查询字符串分别当做日期或者整型数。
  • 如果你查询一个精确值(not_analyzed)字符串字段,它们会将整个查询字符串当做一个单独的词条。
  • 但是如果你查询了一个全文字段(analyzed),它们会首先将查询字符串传入到合适的解析器,用来得到需要查询的词条列表。

一旦查询得到了一个词条列表,它就会使用列表中的每个词条来执行合适的低级查询,然后将得到的结果进行合并,最终产生每份文档的相关度分值。

我们会在后续章节中详细讨论这个过程。


在很少的情况下,你才需要直接使用基于词条的查询(Term-based Queries)。通常你需要查询的是全文,而不是独立的词条,而这个工作通过高级的全文查询来完成会更加容易(在内部它们最终还是使用的基于词条的低级查询)。

如果你发现你确实需要在一个not_analyzed字段上查询一个精确值,那么考虑一下你是否真的需要使用查询,而不是使用过滤器。

单词条查询通常都代表了一个二元的yes|no问题,这类问题通常使用过滤器进行表达更合适,因此它们也能够得益于过滤器缓存(Filter Caching)

GET /_search
{
    "query": {
        "filtered": {
            "filter": {
                "term": { "gender": "female" }
            }
        }
    }
}

 

 

match查询

 

在你需要对任何字段进行查询时,match查询应该是你的首选。它是一个高级全文查询,意味着它知道如何处理全文字段(Full-text, analyzed)和精确值字段(Exact-value,not_analyzed)。

即便如此,match查询的主要使用场景仍然是全文搜索。让我们通过一个简单的例子来看看全文搜索时如何工作的。

索引一些数据

首先,我们会创建一个新的索引并通过bulk API索引一些文档:

DELETE /my_index 

PUT /my_index
{ "settings": { "number_of_shards": 1 }} 

POST /my_index/my_type/_bulk
{ "index": { "_id": 1 }}
{ "title": "The quick brown fox" }
{ "index": { "_id": 2 }}
{ "title": "The quick brown fox jumps over the lazy dog" }
{ "index": { "_id": 3 }}
{ "title": "The quick brown fox jumps over the quick dog" }
{ "index": { "_id": 4 }}
{ "title": "Brown fox brown dog" }

注意到以上在创建索引时,我们设置了number_of_shards为1:在稍后的相关度坏掉了(Relevance is broken)一节中,我们会解释为何这里创建了一个只有一个主分片(Primary shard)的索引。

单词查询(Single word query)

第一个例子我们会解释在使用match查询在一个全文字段中搜索一个单词时,会发生什么:

GET /my_index/my_type/_search
{
    "query": {
        "match": {
            "title": "QUICK!"
        }
    }
}

ES会按照如下的方式执行上面的match查询:

  1. 检查字段类型

    title字段是一个全文字符串字段(analyzed),意味着查询字符串也需要被分析。

  2. 解析查询字符串

    查询字符串"QUICK!"会被传入到标准解析器中,得到的结果是单一词条"quick"。因为我们得到的只有一个词条,match查询会使用一个term低级查询来执行查询。

  3. 找到匹配的文档

    term查询会在倒排索引中查询"quick",然后获取到含有该词条的文档列表,在这个例子中,文档123会被返回。

  4. 对每份文档打分

    term查询会为每份匹配的文档计算其相关度分值_score,该分值通过综合考虑词条频度(Term Frequency)("quick"在匹配的每份文档的title字段中出现的频繁程度),倒排频度(Inverted Document Frequency)("quick"在整个索引中的所有文档的title字段中的出现程度),以及每个字段的长度(较短的字段会被认为相关度更高)来得到。参考什么是相关度(What is Relevance?)

这个过程会给我们下面的结果(有省略):

"hits": [
 {
    "_id":      "1",
    "_score":   0.5, 
    "_source": {
       "title": "The quick brown fox"
    }
 },
 {
    "_id":      "3",
    "_score":   0.44194174, 
    "_source": {
       "title": "The quick brown fox jumps over the quick dog"
    }
 },
 {
    "_id":      "2",
    "_score":   0.3125, 
    "_source": {
       "title": "The quick brown fox jumps over the lazy dog"
    }
 }
]

文档1最相关,因为它的title字段短,意味着quick在它所表达的内容中占比较大。 文档3比文档2的相关度更高,因为quick出现了两次。

 

分享到:
评论

相关推荐

    elasticsearch-7.7.0-2020-linux-x86_64.tar.gz.zip

    Elasticsearch是一个强大的开源搜索引擎,基于Lucene库,由 Elastic 公司开发并维护。它以其高可扩展性、实时性、分布式搜索和分析能力在IT行业中广泛应用,尤其在大数据和日志分析领域表现突出。这里我们将深入探讨...

    day07-Elasticsearch03day07-Elasticsearch03

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

    elasticsearch-2016-8最新可用java代码

    Elasticsearch是一个强大的开源搜索引擎,基于Lucene库,主要用于全文检索、分析和存储数据。它以其高可扩展性、实时性以及丰富的API而备受青睐。本资料“elasticsearch-2016-8最新可用java代码”是针对2016年8月...

    Elasticsearch-sgg

    本资料将带你深入了解Elasticsearch的基础概念、安装配置、索引管理和查询优化。 ### 1. Elasticsearch 基础 - **分布式架构**:Elasticsearch设计为分布式系统,可以自动进行数据分片和复制,确保高可用性和容错...

    Elasticsearch技术解析与实战_高清 带索引书签目录_朱林(著)

    Elasticsearch(简称ES)是一款基于Lucene的分布式、RESTful搜索和分析引擎,广泛应用于大数据处理、日志分析、实时搜索等领域。这本书针对不同层次的读者,提供了深入浅出的技术解析和实战指导。 **1. Elastic...

    elasticsearch-1.7.3.tar.gz

    总之,Elasticsearch 1.7.3是构建高性能、可扩展的搜索和数据分析解决方案的一个强大工具,虽然现在已有更先进的版本,但对于学习基础概念和工作原理,它仍然是一个很好的起点。通过深入理解其核心特性和使用方法,...

    ElasticSearch入门和基础(高清视频教程).rar

    Elasticsearch是一个开源的全文搜索引擎,它被广泛应用于大数据分析和实时搜索领域。这个"**ElasticSearch入门和基础(高清视频教程)**"显然旨在为初学者提供一个全面了解和学习Elasticsearch的平台。在视频教程中...

    1_elasticsearch技术解析与实战

    Elasticsearch是一款开源、分布式、实时的全文搜索和分析引擎,基于Lucene构建,广泛应用于日志分析、实时监控、数据搜索等多个领域。其核心特性包括强大的全文检索能力、分布式架构、自动分词、高可扩展性和实时性...

    Springboot集成Elasticsearch+京东搜索实战代码

    而Elasticsearch则是一个分布式、RESTful风格的搜索引擎,用于实时全文检索和分析,常被用于大数据分析和复杂查询场景。 **1. Spring Boot 集成 Elasticsearch** 集成Elasticsearch到Spring Boot项目中,首先需要...

    【elasticsearch】- Learning elasticsearch

    Elasticsearch 是一款基于 Lucene 的开源搜索和分析引擎,它提供了分布式、实时的全文搜索功能,并且可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。 **1.2 开始使用 Elasticsearch** 本章节将介绍...

    elasticsearch数据库下载、配置、使用案例PPT模板

    ### Elasticsearch...综上所述,Elasticsearch是一款强大的搜索引擎和数据分析平台,适用于多种应用场景。通过本文详细介绍的下载、配置、使用以及优化方法,可以帮助开发者更好地利用Elasticsearch解决实际问题。

    最新ElasticSearch6实战教程

    Elasticsearch 是一个高度可扩展的开源全文搜索引擎,设计用于处理大量数据,提供实时分析和搜索功能。在Elasticsearch 6版本中,它引入了许多新特性,优化了性能,并提高了用户体验。本教程将深入探讨Elasticsearch...

    深入理解ElasticSearch PDF

    Elasticsearch,简称ES,是一款基于Lucene的分布式、RESTful搜索分析引擎,被广泛应用于日志分析、实时监控、数据搜索等领域。这本书旨在帮助读者从理论到实践全面掌握Elasticsearch的精髓。 首先,书中会介绍...

    Elasticsearch权威指南

    首先,书中会介绍Elasticsearch的基本架构,包括分片(Shards)、副本(Replicas)和集群(Cluster)的概念,这些是理解其分布式特性的基础。分片使得大数据量的索引变得可行,而副本则确保了数据的高可用性。 接着...

    elasticsearch基础知识,从小白到入门

    #### 三、Elasticsearch基础概念 **节点、集群和索引:** - **节点**:是Elasticsearch集群中的单一服务器实例。 - **集群**:由一个或多个节点组成,共同维护数据和提供可靠性及容错性。 - **索引**:类似于数据库...

    Elasticsearch顶尖高手系列.zip

    Elasticsearch作为一个流行的开源搜索引擎和分析引擎,广泛应用于日志分析、实时数据检索、大数据处理等多个领域。中华石杉编著的这个系列,通过详尽的讲解和实践案例,覆盖了从基础到高级的各种知识点。 首先,...

    springboot+elasticsearch,入门最详细的项目

    总结来说,"springboot+elasticsearch"项目为初学者提供了一个很好的起点,通过它,你可以学习到如何在SpringBoot应用中集成和使用Elasticsearch,理解它们的核心概念以及如何进行基础的数据操作。这个项目不仅覆盖...

    Elasticsearch5.x Java API手册

    Elasticsearch 是一个流行的开源全文搜索引擎,广泛应用于数据检索、分析和实时数据存储。Java API 提供了与 Elasticsearch 服务器进行交互的接口,使得 Java 开发者能够方便地在应用程序中集成和操作 Elasticsearch...

    ElasticSearch Server

    ElasticSearch Server是一本介绍分布式搜索开源框架的实用书籍,它详细阐述了如何使用ElasticSearch搭建高效率、可扩展的搜索引擎。在分布式搜索系统中,ElasticSearch的运用是构建现代搜索引擎平台的核心技术之一。...

Global site tag (gtag.js) - Google Analytics