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字段赋值。 我是张三李四二; 此时,索引库存储(not_analyzed,无分词)是一体的。 【我是张三李四二】
EU.querybyterm(indexname,indexType,' name ','我是张三李四二');
用term查的话,name的值必须是“我是张三李四二”,即使有一个单词也找不到。 因为索引库中保存着【我是张三李四二】,所以检索的时候必须用这个完整的值进行检索,才能与检索一致。
2 .假设将name字段设置为analyzed:并为索引库name字段赋值。 我是张三李四二;
这时索引存储库存储(analyzed,standard分词)的是【我,是,张,三,李,四,二】
EU.querybyterm(indexname,indexType,' name ','我');
//此时,必须用【我是张三李四二】中的任何一个单独词查才能得出结果。 就算大于一个词的组合,也不会有数据。 因为索引经过分词存放在一个个单独的词【我、好、张、三、李、四、二】里,所以查不到。
使用条件:请在not_analyzed字段中查询正确的值。
2.matchQuery :使用某个字段的值搜索文档; 类似于查询和' BMW什么马力',如果查询匹配,则分词《宝马,多少,马力》将搜索包含这三个词中的一个或多个的所有文档。
一种高级查询,主要用于全文搜索,知道如何处理全文搜索字段(full-text,analyzed )和精确值字段(exact-value,not_analyzed )。
Match示例:
首先,创建新索引,然后使用bulkAPI对几个文档进行索引。
PUT /my_index
{ ' settings ' 3360 { ' number _ of _ shards ' : }
POST/my_index/my_type/_bulk
{ 'index':{ '_id': 1 }}
{ ' title ' : ' thequickbrownfox ' }
{ '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对应文档相似的文档。
未完待续。。。。。。。。。