ElasticSearch 结构化搜索全文

Posted shaomine

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticSearch 结构化搜索全文相关的知识,希望对你有一定的参考价值。

  1、介绍

    上篇介绍了搜索结构化数据的简单应用示例,现在来探寻 全文搜索(full-text search) :怎样在全文字段中搜索到最相关的文档。

    全文搜索两个最重要的方面是:

    相关性(Relevance)
   它是评价查询与其结果间的相关程度,并根据这种相关程度对结果排名的一种能力,这种计算方式可以是 TF/IDF 方法(参见 相关性的介绍)、地理位置邻近、模糊相似,或其他的某些算法。
    分析(Analysis)
   它是将文本块转换为有区别的、规范化的 token 的一个过程,(参见 分析的介绍) 目的是为了(a)创建倒排索引以及(b)查询倒排索引。

    一旦谈论相关性或分析这两个方面的问题时,我们所处的语境是关于查询的而不是过滤。

 

  2、基于词项和基于全文

    所有查询会或多或少的执行相关度计算,但不是所有查询都有分析阶段。 和一些特殊的完全不会对文本进行操作的查询(如 bool 或 function_score )不同,文本查询可以划分成两大家族:

    基于词项的查询
      如 term 或 fuzzy 这样的底层查询不需要分析阶段,它们对单个词项进行操作。用 term 查询词项 Foo 只要在倒排索引中查找 准确词项 ,并且用 TF/IDF 算法为每个包含该词项的文档计算相关度评分 _score 。

     记住 term 查询只对倒排索引的词项精确匹配,这点很重要,它不会对词的多样性进行处理(如, foo或 FOO )。这里,无须考虑词项是如何存入索引的。

     如果是将 ["Foo","Bar"] 索引存入一个不分析的( not_analyzed )包含精确值的字段,或者将 Foo Bar 索引到一个带有 whitespace 空格分析器的字段,两者的结果都会是在倒排索引中有 Foo 和 Bar 这两个词。

    基于全文的查询
      像 match 或 query_string 这样的查询是高层查询,它们了解字段映射的信息:

   1、如果查询 日期(date) 或 整数(integer) 字段,它们会将查询字符串分别作为日期或整数对待。

   2、如果查询一个( not_analyzed )未分析的精确值字符串字段,它们会将整个查询字符串作为单个词项对待。

   3、但如果要查询一个( analyzed )已分析的全文字段,它们会先将查询字符串传递到一个合适的分析器,然后生成一个供查询的词项列表。

  一旦组成了词项列表,这个查询会对每个词项逐一执行底层的查询,再将结果合并,然后为每个文档生成一个最终的相关度评分。

 

    很少直接使用基于词项的搜索,通常情况下都是对全文进行查询,而非单个词项,这只需要简单的执行一个高层全文查询(进而在高层查询内部会以基于词项的底层查询完成搜索)。

    

    当我们想要查询一个具有精确值的 not_analyzed 未分析字段之前, 需要考虑,是否真的采用评分查询,或者非评分查询会更好。

    单词项查询通常可以用是、非这种二元问题表示,所以更适合用过滤, 而且这样做可以有效利用缓存

以上是关于ElasticSearch 结构化搜索全文的主要内容,如果未能解决你的问题,请参考以下文章

全文检索ElasticSearch与Spring boot集成实例

ElasticSearch结构化搜索和全文搜索

Elasticsearch - 简介

Elasticsearch 搜索入门技术之一

Elasticsearch 搜索入门技术之一

数据库-Elasticsearch进阶学习笔记(分片映射分词器即时搜索全文搜索等)