天津11选5购买:elasticsearch基本查詢

作者: 魯智深 分類: java 發布時間: 2018-05-12 23:49

天津11选5中奖结果 www.ebzvaz.com.cn 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
      }
    }
  }
}

如果覺得我的文章對您有用,請隨意打賞。您的支持將鼓勵我繼續創作!

發表評論

電子郵件地址不會被公開。 必填項已用*標注