## 查询重写机制
<div style="text-indent:2em;">
<p>如果你曾经使用过很多不同的查询类型,比如前缀查询和通配符查询,从本质上上,任何的查询都可以视为对多个关键词的查询。可能用户听说过查询重写(query rewrite),ElasticSearch(实际上是Apache Lucene很明显地)对用户的查询进行了重写,这样做是为了保证性能。整个重写过程是把从Lucene角度认为原始的、开销大的查询对象转变成一系列开销小的查询对象的一个过程。</p>
<h3 style="text-indent:0em;">以前缀查询为例</h3>
<p>展示查询重写内部运作机制的最好方法是通过一个例子,查看例子中用户输入的原查询语句中的term在内部被什么Term所取代。假定我们的索引中有如下的数据:</p>
<blockquote>
curl -XPUT 'localhost:9200/clients/client/1' -d<br/>
'{<br/>
"id":"1","name":"Joe"<br/>
}'<br/>
curl -XPUT 'localhost:9200/clients/client/2' -d<br/>
'{<br/>
"id":"2","name":"Jane"<br/>
}'<br/>
curl -XPUT 'localhost:9200/clients/client/3' -d<br/>
'{<br/>
"id":"3","name":"Jack"<br/>
}'<br/>
curl -XPUT 'localhost:9200/clients/client/4' -d<br/>
'{<br/>
"id":"4","name":"Rob"<br/>
}'<br/>
curl -XPUT 'localhost:9200/clients/client/5' -d<br/>
'{<br/>
"id":"5","name":"Jannet"<br/>
}'<br/>
</blockquote>
<br/><!--note structure -->
<div style="height:110px;width:650px;text-indent:0em;">
<div style="float:left;width:13px;height:100%; background:black;">
<img src="../lm.png" height="100px" width="13px" style="margin-top:5px;"/>
</div>
<div style="float:left;width:50px;height:100%;position:relative;">
<img src="../note.png" style="position:absolute; top:30%; "/>
</div>
<div style="float:left; width:550px;height:100%;">
<b><br/>源码下载</b>
<p style="font-size:13px;">所有购买了Packt出版的图书的读者都可以用自己的账户从http://www.packtpub.com. 下载源代码文件。如果读者通过其它的途径下载本书,则需要通过http://www.packtpub.com/support 来注册账号,然后网站会把源码通过e-mail发送到你的邮箱。 </p>
</div>
<div style="float:left;width:13px;height:100%;background:black;">
<img src="../rm.png" height="100px" width="13px" style="margin-top:5px;"/>
</div>
</div> <!-- end of note structure -->
<br/>
<p>我们的目的是找到所有以字符 j 开头的文档。这个需求非常简单,在 client索引上运行如下的查询表达式:</p>
<blockquote>
curl -XGET 'localhost:9200/clients/_search?pretty' -d '{
<blockquote>"query" : {<blockquote>
"prefix" : {
<blockquote>"name" : "j",<br/>
"rewrite" : "constant_score_boolean"</blockquote>
}</blockquote>
}</blockquote>
}'</blockquote>
<p>
我们用的是一个简单的前缀查询;前面说过我们的目的是找到符合以下条件的文档:name域中包含以字符 j 开头的Term。我们用rewrite参数来指定重写查询的方法,关于该参数的取值我们稍后讨论。运行前面的查询命令,我们得到的结果如下:</p>
<blockquote style="text-indent:0em;">{
...<br/>
"hits" : {<blockquote>
"total" : 4,<br/>
"max_score" : 1.0,<br/>
"hits" : [ {<blockquote>
"_index" : "clients",<br/>
"_type" : "client",<br/>
"_id" : "5",<br/>
"_score" : 1.0, "_source" : {"id":"5","name":"Jannet"}</blockquote>
}, {<blockquote>
"_index" : "clients",<br/>
"_type" : "client",<br/>
"_id" : "1",<br/>
"_score" : 1.0, "_source" : {"id":"1", "name":"Joe"}</blockquote>
}, {<blockquote>
"_index" : "clients",<br/>
"_type" : "client",<br/>
"_id" : "2",<br/>
"_score" : 1.0, "_source" : {"id":"2", "name":"Jane"}</blockquote>
}, {<blockquote>
"_index" : "clients",<br/>
"_type" : "client",<br/>
"_id" : "3",<br/>
"_score" : 1.0, "_source" : {"id":"3", "name":"Jack"}</blockquote>
} ]</blockquote>
}
}</blockquote>
</div>
- 前言
- 第1章 认识Elasticsearch
- 认识Apache Lucene
- 熟悉Lucene
- 总体架构
- 分析你的文本
- Lucene查询语言
- 认识 ElasticSearch
- 基本概念
- ElasticSearch背后的核心理念
- ElasticSearch的工作原理
- 本章小结
- 第2章 强大的用户查询语言DSL
- Lucene默认打分算法
- 查询重写机制
- 重排序
- 批处理
- 查询结果的排序
- Update API
- 使用filters优化查询
- filters和scope在ElasticSearch Faceting模块的应用
- 本章小结
- 第3章 索引底层控制
- 第4章 探究分布式索引架构
- 选择恰当的分片数量和分片副本数量
- 路由功能浅谈
- 调整集群的分片分配
- 改变分片的默认分配方式
- 查询的execution preference
- 学以致用
- 本章小结
- 第5章 管理Elasticsearch
- 选择正确的directory实现类——存储模块
- Discovery模块的配置
- 索引段数据统计
- 理解ElasticSearch的缓存
- 本章小结
- 第6章 应对突发事件
- 第7章 优化用户体验
- 第8章 ElasticSearch Java API
- 第9章 开发ElasticSearch插件