1.1 es查询总述
对于文本的查询分两大种类:
1.基于词条的查询(Term-basedQueries)
类似term和fuzzy的查询是不含有解析阶段的低级查询,它们在单一词条上进行操作,一个针对词条Foo的term查询会在倒排索引中寻找词条的精确匹配,然后对每一份含有该词条的文档通过TF/IDF进行相关度_score的计算。
2.全文查询
类似match和query_string这样的查询是高级查询,它们能够理解一个字段的映射:
1. 如果你使用它们去查询一个date或integer字段,它们会将查询字符串分别当做日期或者整形数。
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;
这个时候索引库存储(analyzed,standard分词器分词)的是:【我,是,张,三,李,四,2】
eu.queryByTerm(indexName, indexType,"name", "我");
//这个时候必须用【我是张三李四2】其中的任意一个单独的词去查询,才可以有结果,大于一个词的组合,均查询不出数据,因为索引经过分词后存储的为一个个单独的词【我,是,张,三,李,四,2】,所以查询不到。
使用的条件:你确实要在一个not_analyzed字段上查询一个精确值。
2.matchQuery:使用某一字段的值对文档进行检索;如查询和"宝马多少马力",查询匹配就会进行分词《宝马,多少,马力》,那么所有包含这三个词中的一个或多个的文档就会被搜索出来。
它是一个高级查询,它知道如何处理全文字段(full-text,analyzed)和精确值字段(exact-value,not_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出现了两次。
参考网址:
3 . matchAllQuery:用于匹配文档中的所有字段;相当于select * from语句;
4 . MultiMatchQuery:针对多个字段进行搜索。
5. WildcardQuery:检索指定字段中含有通配符的查询词。
6. QueryString:使用查询解析器构造实际的查询。如querystring(“+中国-日本”)
7. Morelikethis:查询与这个id对应文档相似的文档。
未完待续。。。。。。。。。