做類似交易貓的網(wǎng)站如何優(yōu)化網(wǎng)頁
正排索引 和 倒排索引
正排索引:通過id ,查詢content
倒排索引:通過content,查詢到符合的 ids
eg:
正排索引就是通過《靜夜思》,找到整片文章。
倒排索引通過“明月”,找到《靜夜思》 《望月懷古》《關(guān)山月》等
get 查詢
索引的基本信息:
GET your_index/_mapping? //跟看mysql表字段差不多
GET your_index/_alias? //查看索引的別名
GET /_cat/health?v? //查看集群狀態(tài)
GET _cat/indices // 查看所有index
GET _cat/shards/your_index? //查看指定索引的分片數(shù),每個(gè)分片有主(p)副(r)分片
查詢索引內(nèi)容:
match_all
GET /you_index/_search
{"query":{"match_all": {}
}
bool
?
bool查詢是一個(gè)非常強(qiáng)大且常用的復(fù)合查詢,它允許你組合多個(gè)查詢條件。bool
查詢的核心概念包括以下四種子句:
- must: 子句必須匹配文檔。類似于 SQL 中的 AND 操作符。
- filter: 子句必須匹配文檔,但不影響評分。也就是說,它只過濾文檔,但不參與評分計(jì)算。
- should: 子句可以匹配文檔。如果在一個(gè)
bool
查詢中包含了多個(gè)should
子句,則至少一個(gè)should
子句必須匹配文檔。類似于 SQL 中的 OR 操作符。 - must_not: 子句不能匹配文檔。類似于 SQL 中的 NOT 操作符。
eg:?
GET you_index/_search
{"query": {"bool": {"must": [{"bool": {"should": [{"term": {"name": {"value": "林俊凱","boost": 1}}},{"term": {"zh_name": {"value": "林俊凱","boost": 1}}}]}},{"bool": {"should": [{"range": {"fans_num": {"gte": "800"}}},{"terms": {"tag": [1010,1013]}}]}}]}},"sort": {"_score": {"order": "desc"},"score": {"order": "desc"}}
}
range
"range": {"fans_num": {"gte": 800,"lte":126334}}
gte:大于等于;lte小于等于
term?
?不分詞,精準(zhǔn)完全匹配查詢
GET your_index_search/_search
{"query": {"term": {"name": {"value": "天空"}}}
}
terms
不分詞,命中數(shù)組一個(gè)即可,不要求全部命中
GET your_index_search/_search
{"query": {"terms": {"tag": ["美食","購物"]}}
}
prefix
前綴匹配,不分詞 ,精準(zhǔn)匹配前半部分
GET your_index_search/_search
{"query": {"prefix": {"name_full": {"value": "林俊"}}}
}
林俊凱,林俊xxx都會(huì)命中
multi_match
會(huì)對query詞進(jìn)行分詞
GET your_index_search/_search
{"query": {"bool": {"must": [{"multi_match": {"query": "北京景點(diǎn)","fields": ["name","name_full", "name_lower"],"analyzer":"ik","minimum_should_match":"3<80%"}}]}}
}
這里的 "minimum_should_match": "3<80%"
指定了如下規(guī)則:
-
如果分詞數(shù)量小于或等于 3,則必須匹配所有分詞。
-
如果分詞數(shù)量大于 3,則至少匹配 80% 的分詞。
這里的“analyzer”,是分詞器,常見的有ik ik-smart? standard mla?
GET _analyze
{"analyzer":"mla","text":"北京景點(diǎn)"
}//結(jié)果為
{"tokens": [{"token": "北京","start_offset": 0,"end_offset": 2,"type": "CN_WORD","position": 0},{"token": "景點(diǎn)","start_offset": 2,"end_offset": 4,"type": "CN_WORD","position": 1}]
}
eg:“北京景點(diǎn)”分詞為【北京,景點(diǎn)】,分詞項(xiàng)為2,小于3,那么【北京】和【景點(diǎn)】都需要在field中匹配到。multi_match
查詢的目的是在多個(gè)字段中搜索查詢詞中的詞語,并且匹配規(guī)則會(huì)跨字段應(yīng)用,比如 【北京】在name匹配到,【景點(diǎn)】在name_lower配到到,即匹配成功。
multi_phrase
會(huì)對query詞進(jìn)行分詞(有的人會(huì)認(rèn)為不會(huì)分詞,?),match_phrase要求嚴(yán)格,不僅要求,要能夠匹配到分詞后的所有單詞,且分詞后的單詞順序也要和命中結(jié)果中的順序保持一致。
GET your_index_search/_search
{"query": {"bool": {"must": [{"match_phrase": {"name": "北京"}}]}}
}
name = “北京”能找到,“北 京” 或者“京北” 就找不到
可以設(shè)置slop,最大間隔,默認(rèn)是0
match
會(huì)分詞,沒有multi_phrase那么嚴(yán)格,match要求不高,只要匹配到分詞后的任意一個(gè)單詞,就算查到結(jié)果?。
為什么match能找到,term查詢不到呢?
首先,要看創(chuàng)建索引的時(shí)候mapping ,字段的類型。如果是type是keyword,不允許分詞。
其次,查看字段類型發(fā)現(xiàn)是text,term查詢的字段類型只能是keyword
"keyword_full": {"type": "text","fields": {"keyword": {"type": "keyword"}}},