搜索引擎(Elasticsearch搜索詳解-查詢建議)

學習目標

掌握詞項、短語查詢建議器的用法
掌握自動補全建議器的用法
 html

查詢建議介紹

查詢建議是什麼?java

ES中查詢建議的API後端

查詢建議也是使用_search端點地址。在DSL中suggest節點來定義須要的建議查詢。數據結構

POST twitter/_search
{
  "query" : {
    "match": {
      "message": "tring out Elasticsearch"
    }
  },              //定義建議查詢
  "suggest" : {
    "my-suggestion" : {          //一個建議查詢名
      "text" : "tring out Elasticsearch",   //查詢文本
      "term" : {                //使用詞項建議器
        "field" : "message"     //指定在哪一個字段上獲取建議詞
      }
    }
  }
}
POST _search
{
  "suggest": {
    "my-suggest-1" : {
      "text" : "tring out Elasticsearch",
      "term" : {
        "field" : "message"
      }
    },
    "my-suggest-2" : {
      "text" : "kmichy",
      "term" : {
        "field" : "user"
      }
    }
  }
}

多個建議查詢能夠使用全局的查詢文本app

POST _search
{
  "suggest": {
    "text" : "tring out Elasticsearch",
    "my-suggest-1" : {
      "term" : {
        "field" : "message"
      }
    },
    "my-suggest-2" : {
       "term" : {
        "field" : "user"
       }
    }
  }
}

Suggester 介紹

Term suggesterelasticsearch

term 詞項建議器,對給入的文本進行分詞,爲每一個詞進行模糊查詢提供詞項建議。對於在索引中存在詞默認不提供建議詞,不存在的詞則根據模糊查詢結果進行排序後取必定數量的建議詞。ide

經常使用的建議選項:學習

phrase suggesterui

phrase 短語建議,在term的基礎上,會考量多個term之間的關係,好比是否同時出如今索引的原文裏,相鄰程度,以及詞頻等編碼

POST /ftq/_search
{
  "query": {
    "match_all": {}
  },
  
  "suggest" : {
    "myss":{
      "text": "java sprin boot",
      "phrase": {
        "field": "title"
      }
    }
  }
}

Completion suggester   自動補全

針對自動補全場景而設計的建議器。此場景下用戶每輸入一個字符的時候,就須要即時發送一次查詢請求到後端查找匹配項,在用戶輸入速度較高的狀況下對後端響應速度要求比較苛刻。所以實現上它和前面兩個Suggester採用了不一樣的數據結構,索引並不是經過倒排來完成,而是將analyze過的數據編碼成FST和索引一塊兒存放。對於一個open狀態的索引,FST會被ES整個裝載到內存裏的,進行前綴查找速度極快。可是FST只能用於前綴查找,這也是Completion Suggester的侷限所在。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

爲了使用自動補全,索引中用來提供補全建議的字段需特殊設計,字段類型爲 completion。

PUT music
{
    "mappings": {
        "_doc" : {
            "properties" : {
                "suggest" : {            //用於自動補全的字段
                    "type" : "completion"
                },
                "title" : {
                    "type": "keyword"
                }
            }
        }
    }
}
PUT music/_doc/1?refresh
{
    "suggest" : {
        "input": [ "Nevermind", "Nirvana" ],
        "weight" : 34
    }
}
Input 指定輸入詞
Weight 指定排序值(可選)
PUT music/_doc/1?refresh
{
    "suggest" : [
        {
            "input": "Nevermind",
            "weight" : 10
        },
        {
            "input": "Nirvana",
            "weight" : 3
        }
    ]}
PUT music/_doc/1?refresh
{
  "suggest" : [ "Nevermind", "Nirvana" ]
}
PUT music/_doc/2?refresh
{
    "suggest" : {     //放入一條重複數據
        "input": [ "Nevermind", "Nirvana" ],
        "weight" : 20
    }
}
POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nir", 
            "completion" : { 
                "field" : "suggest" 
            }
        }
    }
}
POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "nir", 
            "completion" : { 
                "field" : "suggest",
                "skip_duplicates": true    //去重
            }
        }    }}
PUT music/_doc/3?refresh
{
    "suggest" : {
        "input": [ "lucene solr", "lucene so cool","lucene elasticsearch" ],
        "weight" : 20
    }   
}                   //存的是短語

PUT music/_doc/4?refresh
{
    "suggest" : {
        "input": ["lucene solr cool","lucene elasticsearch" ],
        "weight" : 10
    }
}
POST music/_search?pretty
{
    "suggest": {
        "song-suggest" : {
            "prefix" : "lucene s", 
            "completion" : { 
                "field" : "suggest" ,
                "skip_duplicates": true
            }
        }
    }
}
相關文章
相關標籤/搜索