1. 程式人生 > >Elasticsearch學習之深入搜索一 --- 提高查詢的精準度

Elasticsearch學習之深入搜索一 --- 提高查詢的精準度

ast 多少 opera 相關度 滿足 ini 無法 sea 進行

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"} }
View Code

2. 搜索標題中包含java或elasticsearch的blog

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

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

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就會更高

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

Elasticsearch學習之深入搜索一 --- 提高查詢的精準度