ElasticSearch 系列文章
1 ES 入門之一 安裝ElasticSearcha
2 ES 記錄之如何創建一個索引映射
3 ElasticSearch 學習記錄之Text keyword 兩種基本類型區別
4 ES 入門記錄之 match和term查詢的區別
5 ElasticSearch 學習記錄之ES幾種常見的聚合操作
6 ElasticSearch 學習記錄之父子結構的查詢
7 ElasticSearch 學習記錄之ES查詢添加排序字段和使用missing或existing字段查詢
8 ElasticSearch 學習記錄之ES高亮搜索
9 ElasticSearch 學習記錄之ES短語匹配基本用法
10 ElasticSearch 學習記錄之 分布式文檔存儲往ES中存數據和取數據的原理
11 ElasticSearch 學習記錄之集群分片內部原理
12 ElasticSearch 學習記錄之ES如何操作Lucene段
13 ElasticSearch 學習記錄之如任何設計可擴容的索引結構
14 ElasticSearch之 控制相關度原理講解
短語匹配
短語匹配故名思意就是對分詞后的短語就是匹配,而不是僅僅對單獨的單詞進行匹配
下面就是根據下面的腳本例子來看整個短語匹配的有哪些作用和優點
GET /my_index/my_type/_search
{
"query": {
"match_phrase": {
"title": "quick brown fox"
}
}
}
//查詢分詞之后連續的
//例如 brown fox 可以查詢到,但是quick fox 查詢不到
//也可以使用下面的方式,這兩種方式是相同的,只不過寫法不同而已
POST /product/_search
{
"query": {
"match": {
"name":{
"query": "1130 對接",
"type": "phrase"
}
}
}
}
根據上面的我們對短語匹配有些總結
- quick 、 brown 和 fox 需要全部出現在域中
- brown 的位置應該比 quick 的位置大 1
- fox 的位置應該比 quick 的位置大 2
- 上面任何一個選項不成立,則該文檔不能認定為匹配
對 短語查詢進行一些優化
通過加入slop參數,可以靈活的控制短語查詢的,
slop 參數告訴 match_phrase 查詢詞條相隔多遠時仍然能將文檔視為匹配
POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": "1130 對接 測試",
"slop" : 10
}
}
}
}
越近越好,當我們給一個短語查詢設置了很高的額slop時,就像下面這樣
POST product/_search
{
"query": {
"match_phrase": {
"name": {
"query": " 上海 自由行",
"slop" : 100
}
}
}
}
//但是雖然我們給了很高的slop值,我們可以根據返回的score分數值來進行判斷幾個字段是否更加的臨近。
部分匹配
-
prefix 前綴查詢
前綴查詢,就是將一個詞從頭開始查。 例如某個數據是上海一日游 可利用前綴查詢查詢 上海POST /product/_search { "query": { "prefix": { "departureCitys": { "value": "上" } }· } }
prefix 前綴查詢,不會在搜索的時候分析字符串,它假定傳入的字符串就是正要查詢的前綴
**默認狀態下, prefix 查詢不做相關度評分計算,它只是將所有匹配的文檔返回,並為每條結果賦予評分值 1 **
- 前綴搜索的步驟
- 掃描詞列表,並查找第一個關鍵詞
- 收集關聯的文檔id
- 移動到下一個詞。
- 如果這個詞也是以 關鍵字開頭,查詢跳回到第二步再重復執行,直到下一個詞不以關鍵字 為止。
Elasticsearch - 理解字段分析過程(_analyze與_explain)
-
_explain 用來幫助分析文檔的relevance score是如何計算出來
- GET /product/_analyze?text="自由行", 使用默認的額analyze來分析自由行
- 指定的analyzer來分析 例如 GET /product/_analyze ?analyzer=pinyin_analyzer&text=" 自由行"
- 指定field的analyzer來分析 GET /product/_analyze?field=base.name&text=" 自由行"
-
_analyze用來分析每一個field或者某個analyzer/tokenizer是如何分析和索引一段文字
- 使用_explain向ElasticSearch詢問慶於該文檔是如何匹配(或者沒有匹配上)的解釋信息
POST /product/_search { "explain": true, "size": 1, "query": { "match": { "name": "三亞" } } }
查詢時輸入即搜索
match_phrase_prefix 查詢, 短語查詢和前綴查詢的組合
GET /product/_search
{
"query": {
"match_phrase_prefix": {
"name": {
"query": "上 海",
"slop" : 20,
"max_expansions": 50
}
}
}
}
slop 來使整個詞序位置不是那么的嚴格
參數 max_expansions 控制着可以與前綴匹配的詞的數量
Elasticsearch進行search查詢的過程中,出現了Result window is too large錯誤
- ES默認窗口10000。可以用修改index.max_result_window參數來解決問題
- curl -XPUT http://127.0.0.1:9200/product/_settings -d '{ "index" : { "max_result_window" : 100000}}'