zl程序教程

您现在的位置是:首页 >  工具

当前栏目

es 常用查询介绍

ES 查询 介绍 常用
2023-09-27 14:22:13 时间

1.1  es查询总述

对于文本的查询分两大种类:

1.基于词条的查询(Term-basedQueries)

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

2.全文查询

  类似matchquery_string这样的查询是高级查询,它们能够理解一个字段的映射:

1.          如果你使用它们去查询一个dateinteger字段,它们会将查询字符串分别当做日期或者整形数。

2.          如果你查询一个精确值(not_analyzed)字符串字段,它们会将查询字符串当做一个单独的词条。

3.          如果你查询一个全文字段(analyzed),它们会首先将查询字符串传入到合适的解析器中,用来得到需要查询的词条列表。它们会使用词条列表中的的每个词来执行合适的低级查询,然后将得到的结果进行合并,最终产生每份文档的相关度分值。

3.全文检索的流程

1.      提交查询的搜素词

2.      使用分词器对搜索词进行分词

3.      用分过的词条去倒排索引中查询文档,

4.      对查找的文档进行相关度计算(文档频率,词条频率,字段的长度等考虑因素),然后进行打分

5.      最后对结果进行排序响应输出。

6.2  es常用查询

1.      tremQuery:代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇.可理解为:不解析,精确的低级查询。

1.      假设name字段设置not_analyzed: 向索引库name字段赋值:我是张三李四2;这个时候索引库存储(not_analyzed不分词)的是一个整体:【我是张三李四2

eu.queryByTerm(indexName,indexType, "name", "我是张三李四2");

         //使用term去查询,name的值必须是“我是张三李四2”,少一个单词都查询不到,因为索引库中存的就是【我是张三李四2】,搜索的时候必须用这个完整的值的去查询,才能匹配搜索到。

2.假设name字段设置analyzed: 向索引库name字段赋值:我是张三李四2

这个时候索引库存储(analyzedstandard分词器分词)的是:【我,是,张,三,李,四,2

       eu.queryByTerm(indexName, indexType,"name", "");

//这个时候必须用【我是张三李四2】其中的任意一个单独的词去查询,才可以有结果,大于一个词的组合,均查询不出数据,因为索引经过分词后存储的为一个个单独的词【我,是,张,三,李,四,2】,所以查询不到。

           使用的条件:你确实要在一个not_analyzed字段上查询一个精确值。

2.matchQuery:使用某一字段的值对文档进行检索;如查询和"宝马多少马力",查询匹配就会进行分词《宝马,多少,马力》,那么所有包含这三个词中的一个或多个的文档就会被搜索出来。

它是一个高级查询,它知道如何处理全文字段(full-text,analyzed)和精确值字段(exact-valuenot_analyzed,主要用于全文收索

Match的例子:

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

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 browndog" }

使用match查询在一个全文字段中搜索一个单词:如下

GET/my_index/my_type/_search

{

    "query": {

        "match": {

            "title": "QUICK!"

        }

    }

}

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

1.    检查字段类型

Title字段是一个全文字符串字段(analyezed),额查询字符串也需要被解析。

2.    解析查询字符串

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

3.    找到匹配的文档

Term查询会在倒排索引中查询“quick”,然后获取到含有该词条的文档列表,在这个例子中,文档1,2,3会被返回。

4.     对每份文档打分

Term查询会为每份匹配的文档计算其相关度分值_score,该分值通过综合考虑词条频度(“quick”在匹配的每份文档的titile字段中出现的频繁程度)、倒排频度(“quick”在整个索引中的所有文档的title字段中的出现程度),以及每个字段的长度(较短的字段会被认为相关度更高)来得到。

"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出现了两次。

参考网址:http://blog.csdn.net/dm_vincent/article/details/41693125

http://www.cnblogs.com/yjf512/p/4897294.html

 

3 .  matchAllQuery:用于匹配文档中的所有字段;相当于select * from语句;

4 .  MultiMatchQuery:针对多个字段进行搜索。

5.      WildcardQuery:检索指定字段中含有通配符的查询词。

6.      QueryString:使用查询解析器构造实际的查询。如querystring(“+中国-日本”)

7.      Morelikethis:查询与这个id对应文档相似的文档。

未完待续。。。。。。。。。