elasticsearch基本查询

作者: 鲁智深 分类: java 发布时间: 2018-05-12 23:49

elasticsearch是功能非常强大的搜索引擎,使用它的目地就是为了快速的查询到需要的数据。

查询的分类:

基本查询:使用elasticsearch内置查询条件进行查询
组合查询:把多个查询组合在一起进行复合查询
过滤:查询同时,通过filter条件在不影响打分的情况下筛选数据

先创建索引,并加入分析器,会用到elasticsearch-analysis-ik插件,已经集成到elasticsearch-rtf中,elasticsearch支持中文分词,但是效果没有elasticsearch-analysis-ik的效果好。

下面我们在title类型中加入了“analyzer”: “ik_max_word”那么title字段中内容会用ik_max_word进行分词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#创建索引
#创建索引
PUT jobbole
{
  "mappings": {
    "job": {
      "properties": {
        "title":{
          "type": "text",
          "analyzer": "ik_max_word"
        },
        "salary_min":{
          "type": "integer"
        },
        "city":{
          "type": "keyword"
        },
        "company":{
          "properties": {
            "name":{
              "type":"text"
            },
            "company_addr":{
              "type":"text"
            }
          }
        },
        "publish_date":{
          "type": "date",
          "format": "yyyy-mm-dd"
        },
        "comments":{
          "type": "integer"
        }
      }
    }
  }
}

elasticsearch-analysis-ik文档中介绍了ik_smart , ik_max_word两种分词分析器

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;

ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。

具体介绍看github文档吧!

创建了索引,在来点数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
POST jobbole/job/
{
  "title":"python分布式爬虫开发",
  "salary_min":1500,
  "city":"苏州",
  "company":{
    "name":"中国移动",
    "company_addr":"苏州园区"
  },
  "publish_date":"2017-4-16",
  "comments":15
}

POST jobbole/job/
{
  "title":"python web开发",
  "salary_min":1600,
  "city":"苏州",
  "company":{
    "name":"中国移动",
    "company_addr":"苏州园区"
  },
  "publish_date":"2017-4-16",
  "comments":15
}
........
......

进入正题,其实现查询

match查询

会对输入进行分词,比如我输入python或者python爬虫,python开发,都会存在python这个单词,中文也是一样。mactch用到我们索引中自定义的分词器elasticsearch-analysis-ik进行匹配。

1
2
3
4
5
6
7
8
9
#match查询
GET jobbole/job/_search
{
  "query": {
    "match": {
      "title": "python"
    }
  }
}

term查询

相当于keyword,不进行对搜索分词处理的,全部匹配的查询,如果我搜索条件是python人工智能,那么返回的结果是null

1
2
3
4
5
6
7
8
9
#term查询
GET jobbole/job/_search
{
  "query": {
    "term": {
      "title": "python人工智能"
    }
  }
}

terms查询

顾名思义就是能输入多个值,进行查询,在titile里面加入”python人工智能”,”爬虫”,搜索结果返回列表中存在数据。

1
2
3
4
5
6
7
8
GET jobbole/job/_search
{
  "query": {
    "terms": {
      "title": ["python人工智能","爬虫"]
    }
  }
}

match查询,控制返回的数量

用次方法查询,能解决分页问题,from从第几个数据开始0,1,2,3等等,size返回的结果数量。

1
2
3
4
5
6
7
8
9
10
GET jobbole/job/_search
{
  "query": {
    "match": {
      "title": "python"
    }
  },
  "from": 1,
  "size": 4
}

match_all,返回所有数据

1
2
3
4
5
6
7
GET jobbole/job/_search
{
  "query": {
    "match_all": {}
    }
  }
}

match_phrase,短语匹配

就像用于全文搜索的的match查询一样,当你希望寻找邻近的单词时,match_phrase查询可以帮你达到目的。slop是词与词之间的距离。

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "match_phrase": {
      "title": {
        "query":"python开发",
        "slop":6
      }
    }
  }
}

multi_match,指定多个字段查询

1
2
3
4
5
6
7
8
9
GET jobbole/job/_search
{
  "query": {
    "multi_match": {
        "query":"python苏州",
        "fields":["title","company_addr"]
    }
  }
}

stored_fields指定返回的字段

这里的需要注意的是elasticsearch默认是false不显示返回字段,需要去设置store=true,才能指定返回字段查询。

索引:

1
2
3
4
5
6
"properties": {
        "title":{
          "store": true,
          "type": "text",
          "analyzer": "ik_max_word"
        }

查询语句

1
2
3
4
5
6
7
8
9
GET jobbole/job/_search
{
  "stored_fields": ["title","city"],
  "query": {
    "match": {
      "title":"python"
    }
  }
}

通过sort把结果排序

desc降序,asc升序,我们对salary_min字段进行了排序

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "match_all": {}
  },
    "sort":[{
      "salary_min":{
        "order":"desc"
      }
    }]
}

range范围查询

Index时boost(index time boost)&Query时boost(query time boost):可以在索引时和查询时进行boost。对特定的field进行boost时,会让得分的计算更加明显。

1
2
3
4
5
6
7
8
9
10
11
12
GET jobbole/job/_search
{
  "query": {
    "range": {
      "salary_min": {
        "gte": 1700,
        "lte": 1800,
        "boost": 1
      }
    }
  }
}

rang范围查询时间的用法

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2017-4-14",
        "lte": "now"
      }
    }
  }
}

wildcard模糊查询

1
2
3
4
5
6
7
8
9
10
11
GET jobbole/job/_search
{
  "query": {
    "wildcard": {
      "title": {
        "value": "pyth*",
        "boost": 3
      }
    }
  }
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注