quot;gte": 比较值
[,"lte": 比较值]
}
}
}
}
GET /douban/book/_search
{
"query": {
"range": {
"book_pages": {
"gte": 352,
"lt":400
}
}
}
}
// term用于匹配字符串和数值型类型的数据(解决了range中没有eq的问题),但不能直接用于分词的字段。
//【这个并没有那么简单,会后续再讲,直接匹配一些会分词的字段时,会匹配失败,
//因为这时候这个字段拿来匹配的都是散乱的值,不是完整的原本的字段数据,所以下面用了不分词的数值型的字段来演示】
GET /douban/book/_search
{
"query": {
"term": {
"字段": "搜索值"
}
}
}
GET /douban/book/_search
{
"query": {
"term": {
"book_pages": 352
}
}
}
//terms
GET /douban/book/_search
{
"query": {
"terms": {
"字段": ["搜索值1","搜索值2"]
}
}
}
GET /douban/book/_search
{
"query": {
"terms": {
"book_pages": [
"352",
"400"
]
}
}
}
term的问题:
- 首先,提一下的是,在搜索的时候,你并不直接面向原始文档数据,而是面向倒排索引,这意思是什么呢?比如你要进行全文搜索,那么你的搜索值并不是与数据文件比对的,而是与倒排索引匹配的,也就是在我们与数据文件之间有一个专门用于搜索的层次。
- 对于match和match_all,这些都是全文搜索,就不说了,直接就是通过索引词在索引文件中找到对应的文档;比较不同的是match_phrase这个会匹配一段词的搜索,他是怎么查询的呢?他实际上也会去查索引文件中包括了搜索值中所有词并且词的在文档中的位置顺序也一致的记录,所以这个短语匹配其实也是通过倒排索引来搜索的。
- 而倒排索引中其实包含了所有字段的标识,对于分词的字段,会存储索引词;对于不分词的,会存储整个数据。【对于分词的字段可以加一个keyword来保留完整的数据,这个后面再讲。】
- 而term的搜索主要面向不分词的数据,所以无法直接用于分词的字段,除非加keyword。
官方文档中关于term
filter与bool
filter也可以用于多条件拼接。例如:
GET /douban/book/_search
{
"query": {
"bool": {
"must": [
{
"match":{
"book_name":"Story"
}
},
{
"range": {
"book_pages": {
"lte":300
}
}
}
]
}
}
}
GET /douban/book/_search
{
"query": {
"bool": {
"must": [
{
"match":{
"book_name":"Story"
}
},
{
"range": {
"book_pages": {
"lte":300
}
}
},
{
"term": {
"publish_date": "1994-02-01"
}
}
]
}
}
}
在这样条件搜索和过滤一起用的情况下,要注意filter过滤是不计算相关度的,在上面中,假设只有match,那么某个文档相关度为0.2,加上filter后,会变成1.2。因为filter默认提供的相关度为1。
constant_score
过滤还可以这样写:
GET /douban/book/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"book_pages": {
"gte": 352,
"lt": 400
}
}
}
}
}
}
// boost设置filter提供的相关度score值
GET /douban/book/_search
{
"query": {
"constant_score": {
"filter": {
"range": {
"book_pages": {
"gte": 352,
"lt": 400
}
}
},
"boost": 1.2
}
}
}
cache
对于过滤,elasticsearch会临时缓存它的结果,以便可能下次仍需使用它。因为过滤是不关心相关度的。
官方文档--过滤缓存
小节总结:
这节介绍了不影响相关度的搜索--过滤,过滤通常用于过滤结构化数据,也就是那些不分词的数据,其中range用于数值范围过滤,term用于字符类型的数据或数值类型的数据的值是否相等,terms是term的复数版。过滤也支持bool拼接多个条件。过滤提供的相关度分数是一个常数,默认是1。
文档的聚合分析
准备数据
先准备一批测试数据:
PUT /people/test/1
{
"name":"lilei1",
"age":18,
"gender":1
}
PUT /people/test/2
{
"name":"lilei2",
"age":17,
"gender":0
}
PUT /people/test/3
{
"name":"lilei4",
"age":21,
"gender":1
}
PUT /people/test/4
{
"name":"lilei4",
"age