前面主要介绍了Elasticsearch的索引和映射,但这两个内容只解决存储的问题,在使用Elasticsearch的时候,大部分是和搜索相关的内容。
现在开始介绍Elasticsearch的搜索功能,通过学习详细了解搜索的语法和查询专用语言(DSL)的相关知识。
深入搜索
搜索方式
1.URL参数搜索
请求:GET http://127.0.0.1:9200/secislan/_search?参数,多个参数用&分开。
2.POST请求参数搜索
请求:POST http://127.0.0.1:9200/secislan/_search。参数在请求头中。
参数是JSON格式的查询领域语法(query dsl),如果需要搜索分页,可以通过from size组合来进行。from表示从第几行开始,size表示查询多少条文档。from默认为0,size默认为10
注意 size的大小不能超过index.max_result_window这个参数的设置,默认为10000。
3.排序sort
当搜索的字段有多个时,可以对指定字段进行排序。例如下面的搜索优先对price字段进行排序,然后对count字段进行排序:
当一个字段的内容有多个值的时候,系统支持一些计算进行排序,包括min、max、sum、avg、median(中间值)。
4.数据列过滤数据列过滤
允许在查询的时候不显示原始数据,或者显示部分原始字段。例如:只查询商品的名称和价格:
GET /ecommerce/product/_search
{
"query":{
"match_all":{}
},
"_source":["name","price"]
}
查询名称包含yagao,并且售价大于25的商品: bool可以封装多个查询条件
GET /ecommerce/_search
{
"query":{
"bool":{
"must":{
"match":{
"name":"yagao"
}
},
"filter":{
"range":{
"price":{
"gt" : 25
}
}
}
}
}
}
具体的查询就不看了,使用的时候再细看。
ElasticSearch DSL
Elasticsearch提供了基于JSON的完整查询DSL(特定于域的语言)来定义查询。将查询DSL视为查询的AST(抽象语法树),它由两种子句组成:
查询和过滤
- □叶查询子句:在特定的字段上查找特定的值,比如match、term或者range查询。这些查询可以自己使用。
- □复合查询子句:包含其他叶查询或复合查询子句,以合理的方式结合多条查询(比如bool或dis_max查询),或者改变查询行为(比如not或constant_score查询)。
- □查询(query)用于检查内容与条件是否匹配,并且计算_score元字段表示匹配度。查询的结构中以query参数开始来执行内容查询。
- □过滤(filter)不计算匹配得分,只是简单地决定文档是否匹配。内容过滤主要用于过滤结构化的数据,例如:时间段是否在2015到2016年之间,status字段是否设置为“published”。
我们在使用ElasticSearch的时候,避免不了使用DSL语句去查询,就像使用关系型数据库的时候要学会SQL语法一样。如果我们学习好了DSL语法的使用,那么在日后使用和使用Java Client调用时候也会变得非常简单。
举个查询子句的例子。查询会匹配符合下列所有条件的文档:
- □title字段包含单词Search。
- □content字段包含单词Elasticsearch。
- □status字段包含准确的单词published。
- □publish_date字段包含从2015年1月1日之后的日期。
请求:POST http://127.0.0.1:9200/secisland/_search
query参数表示内容查询。内容查询中使用的bool和match子句,用于计算每个文档的匹配得分。
filter参数表示内容过滤。内容过滤中使用的term和range子句,会过滤掉不匹配的文档,并且不影响计算文档匹配得分。
最简单的查询,匹配所有文档,文档的_score值是1.0。
可以使用boost参数修改_score值:
高亮显示
Elasticsearch中的高亮显示是来源于Lucene的功能,允许在一个或者多个字段上突出显示搜索内容,
Lucene支持三种高亮显示方式
highlighter、fast-vector-highlighter、postings-highlighter
第一种是默认的标准类型。下面先看一个实例,在搜索前,先增加一条文档。
请求:PUT http://127.0.0.1:9200/secilog/log/10?pretty
参数:
文档创建好后,我们进行高亮搜索:
请求:POST http://127.0.0.1:9200/secilog/log/_search?pretty
参数:
有高亮显示的内容,<em>analyse</em>。为了执行高亮显示,该字段必须有实际的内容。并且这个字段必须进行存储,就是在字段映射中store的值必须为true,不能只在内存中。系统会自动加载_source字段并匹配相关的列。字段名称支持通配符符号,例如可以用"message*":{}参数匹配所有message开头的字段。