1. 程式人生 > >ElasticSearch教程——精準全文檢索

ElasticSearch教程——精準全文檢索

ElasticSearch彙總請檢視:ElasticSearch教程——彙總篇

 

1、為帖子資料增加標題欄位

POST /forum/article/_bulk
{ "update": { "_id": "1"} }
{ "doc" : {"title" : "this is java and elasticsearch blog"} }
{ "update": { "_id": "2"} }
{ "doc" : {"title" : "this is java blog"} }
{ "update": { "_id": "3"} }
{ "doc" : {"title" : "this is elasticsearch blog"} }
{ "update": { "_id": "4"} }
{ "doc" : {"title" : "this is java, elasticsearch, hadoop blog"} }
{ "update": { "_id": "5"} }
{ "doc" : {"title" : "this is spark blog"} }

 

2、搜尋標題中包含java或elasticsearch的blog

這個,就跟term query(termQuery不帶分詞器)不一樣了。不是搜尋exact value,是進行full text全文檢索。
match query,是負責進行全文檢索的。當然,如果要檢索的field,是not_analyzed型別的,那麼match query也相當於term query。

GET /forum/article/_search
{
    "query": {
        "match": {
            "title": "java elasticsearch"
        }
    }
}

 

3、搜尋標題中包含java和elasticsearch的blog

搜尋結果精準控制的第一步:靈活使用and關鍵字,如果你是希望所有的搜尋關鍵字都要匹配的,那麼就用and,可以實現單純match query無法實現的效果

GET /forum/article/_search
{
    "query": {
        "match": {
            "title": {
		"query": "java elasticsearch",
		"operator": "and"
   	    }
        }
    }
}

 

4、搜尋包含java,elasticsearch,spark,hadoop,4個關鍵字中,至少3個的blog

控制搜尋結果的精準度的第二步:指定一些關鍵字中,必須至少匹配其中的多少個關鍵字,才能作為結果返回

minimum_should_match,主要是用來幹嘛的?
去長尾,long tail
長尾,比如你搜索5個關鍵詞,但是很多結果是隻匹配1個關鍵詞的,其實跟你想要的結果相差甚遠,這些結果就是長尾
minimum_should_match,控制搜尋結果的精準度,只有匹配一定數量的關鍵詞的資料,才能返回
 

GET /forum/article/_search
{
  "query": {
    "match": {
      "title": {
        "query": "java elasticsearch spark hadoop",
        "minimum_should_match": "75%"
      }
    }
  }
}

 

5、用bool組合多個搜尋條件,來搜尋title

GET /forum/article/_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "java" }},
      "must_not": { "match": { "title": "spark"  }},
      "should": [
                  { "match": { "title": "hadoop" }},
                  { "match": { "title": "elasticsearch"   }}
      ]
    }
  }
}

 

6、bool組合多個搜尋條件,如何計算relevance score

must和should搜尋對應的分數,加起來,除以must和should的總數

排名第一:java,同時包含should中所有的關鍵字,hadoop,elasticsearch
排名第二:java,同時包含should中的elasticsearch
排名第三:java,不包含should中的任何關鍵字

should是可以影響相關度分數的

must是確保說,誰必須有這個關鍵字,同時會根據這個must的條件去計算出document對這個搜尋條件的relevance score
在滿足must的基礎之上,should中的條件,不匹配也可以,但是如果匹配的更多,那麼document的relevance score就會更高

結果:

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 3,
    "max_score": 1.3375794,
    "hits": [
      {
        "_index": "forum",
        "_type": "article",
        "_id": "4",
        "_score": 1.3375794,
        "_source": {
          "articleID": "QQPX-R-3956-#aD8",
          "userID": 2,
          "hidden": true,
          "postDate": "2017-01-02",
          "tag": [
            "java",
            "elasticsearch"
          ],
          "tag_cnt": 2,
          "view_cnt": 80,
          "title": "this is java, elasticsearch, hadoop blog"
        }
      },
      {
        "_index": "forum",
        "_type": "article",
        "_id": "1",
        "_score": 0.53484553,
        "_source": {
          "articleID": "XHDK-A-1293-#fJ3",
          "userID": 1,
          "hidden": false,
          "postDate": "2017-01-01",
          "tag": [
            "java",
            "hadoop"
          ],
          "tag_cnt": 2,
          "view_cnt": 30,
          "title": "this is java and elasticsearch blog"
        }
      },
      {
        "_index": "forum",
        "_type": "article",
        "_id": "2",
        "_score": 0.19856805,
        "_source": {
          "articleID": "KDKE-B-9947-#kL5",
          "userID": 1,
          "hidden": false,
          "postDate": "2017-01-02",
          "tag": [
            "java"
          ],
          "tag_cnt": 1,
          "view_cnt": 50,
          "title": "this is java blog"
        }
      }
    ]
  }
}

 

7、搜尋java,hadoop,spark,elasticsearch,至少包含其中3個關鍵字

預設情況下,should是可以不匹配任何一個的,比如上面的搜尋中,this is java blog,就不匹配任何一個should條件
但是有個例外的情況,如果沒有must的話,那麼should中必須至少匹配一個才可以
比如下面的搜尋,should中有4個條件,預設情況下,只要滿足其中一個條件,就可以匹配作為結果返回

但是可以精準控制,should的4個條件中,至少匹配幾個才能作為結果返回

GET /forum/article/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "java" }},
        { "match": { "title": "elasticsearch"   }},
        { "match": { "title": "hadoop"   }},
	{ "match": { "title": "spark"   }}
      ],
      "minimum_should_match": 3 
    }
  }
}

 

總結

1、全文檢索的時候,進行多個值的檢索,有兩種做法:match query,should;
2、控制搜尋結果精準度:and operator,minimum_should_match