多次查询以及查询的合并
来源:互联网 发布:空白网名软件是什么 编辑:程序博客网 时间:2024/06/14 23:03
如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活。幸运的是,通过match来实现多次查询也同样简单:
GET /my_index/my_type/_search{ "query": { "match": { "title": "BROWN DOG!" } }}以上查询会返回所有的四份文档:
{ "hits": [ { "_id": "4", "_score": 0.73185337, "_source": { "title": "Brown fox brown dog" } }, { "_id": "2", "_score": 0.47486103, "_source": { "title": "The quick brown fox jumps over the lazy dog" } }, { "_id": "3", "_score": 0.47486103, "_source": { "title": "The quick brown fox jumps over the quick dog" } }, { "_id": "1", "_score": 0.11914785, "_source": { "title": "The quick brown fox" } } ]}文档四的相关度最高,因为它包含了"brown"两次和"dog"一次,文档二和三都包含了"brown"和"dog"一次,同时他们title字段拥有相同的长度,因此他们的分值相同。文档一只包含了"brown"。
因为match查询需要查询两个词条-【"brown",”dog“】,在内部需要执行两个term查询,然后将他们的结果合并起来得到整体的查询结果。
从上面的例子当中可以得到的经验是,文档的title字段当中至少包含一个指定的词条,就能够匹配该查询。如果匹配的越多,也就意味着该文档的相关度越高。
提高查询精度【improving precision】:
匹配任何查询词条就算匹配的话,会有大量的冗余结果。我们大概只想要显示包含了所有查询词条的文档。换言之,相比brown or dog,我们更想要的结果是brown and dog。
match查询接受一个operator参数,该参数的默认值是"or"。你可以将它改变为”and“来要求所有的词条都需要匹配。
GET /my_index/my_type/_search{ "query": { "match": { "title": { "query": "BROWN DOG!", "operator": "and" } } }}控制精度(controlling Precision)
在all或者any中选择有种非黑即白的感觉。如果用户指定了5个词条,而一份文档只包含了其中的四个呢?将operator设置成"and"会将它排除在外。
有时候这正是你想要的,但是对于大多数全文搜索的场景,你会希望将相关度高德文档包含在结果中,将相关度低的排除在外。换言之,我们需要一种介于两者之间的一个方案。
match查询支持minmum_should_match参数,通常会指定一个百分比:
GET /my_index/my_type/_search{ "query": { "match": { "title": { "query": "quick brown dog", "minimum_should_match": "75%" } } }}合并查询(Combing Queries):
在合并过滤器当中,bool过滤器来合并多个过滤器以实现and,or和not逻辑。bool查询也做了类似到了事情,但是有一个显著不同的地方。
过滤器做出一个二元的决定,而查询,则更加微妙。它们不仅要决定是否包含一份文档,还需要决定这份文档有多相关。
和过滤器类似,bool查询通过must,must_not,should参数来接受多个查询。比如,
GET /my_index/my_type/_search{ "query": { "bool": { "must": { "match": { "title": "quick" }}, "must_not": { "match": { "title": "lazy" }}, "should": [ { "match": { "title": "brown" }}, { "match": { "title": "dog" }} ] } }}title字段当中包含有字段"quick",并且不包含字段"lazy"的任何字段都会作为结果返回。目前为止,它的工作方式和bool过滤器十分相似。
差别来自于两个should语句,它表达了这种意思:一份文档不被要求需要包含"brown"和”dog“,但是如果它含有了,那么它的相关度会更高。
{ "hits": [ { "_id": "3", "_score": 0.70134366, "_source": { "title": "The quick brown fox jumps over the quick dog" } }, { "_id": "1", "_score": 0.3312608, "_source": { "title": "The quick brown fox" } } ]}
分值计算(Score Caculation):
bool查询通过将匹配的must和should语句的_score相加,然后除以must和should语句的总数来得到相关度分值_score。must_not语句不会影响分值;它的唯一目的是将不需要的文档排除在外。
控制精度(Controlling Precision):
所有的must语句都需要匹配,而所有的must_not都不需要匹配,但是should需要匹配多少个呢?默认情况下,should语句一个都需要匹配,只有一个特例:如果查询中没有must语句,那么只要要匹配一个should语句。
minmun_should_match可以是一个绝对数或者一个百分比。
GET /my_index/my_type/_search{ "query": { "bool": { "should": [ { "match": { "title": "brown" }}, { "match": { "title": "fox" }}, { "match": { "title": "dog" }} ], "minimum_should_match": 2 } }}
- 多次查询以及查询的合并
- SqlServer_select-多次sum查询结果合并;
- SqlServer_select-多次sum查询结果合并;
- SQL语言查询多列合并以及唯一性查询
- 合并查询
- 合并查询
- Delphi Adoquery 多次查询
- oracle的查询结果合并
- 并查集的一些基本概念以及基本操作(初始化,合并,查询等操作)
- 多表查询----合并查询
- mybatis多次查询缓存问题
- 两张有关联的表的合并查询
- 将多次查询的数据填充到同一数据源
- 将多次查询的数据填充到同一数据源
- 查询字段值出现多次的字段值
- 【mybatis】多次查询缓存的问题 flushCache为什么失效
- SQL列合并的查询问题
- MyBatis分页的拓展--合并高级查询
- Java压缩文件
- Maven建立基于jetty容器的简单的web工程
- 延时执行的几种方式
- 为什么局域网内做服务器要在路由器上做端口映射?
- iOS开发-拨打电话的三种方式
- 多次查询以及查询的合并
- spring mvc学习(一)
- C# 从服务器下载文件代码
- 竟然是他介绍认识人很少人害死人
- Kinect入门(2)——显示深度图像数据流
- sql services 2008r2 windows用户下新建用户
- 从零开始自学Swift(九)
- 小项目中的小总结
- 微信公众平台深度开发Java版 v2.0