- Term 的 重要性
- Term 是表達語意的最小單位。搜尋和利用統計語言模型進行自然語言處理都需要處理Term
- 特點
- Term Level Query:Term Query / Range Query / Exists Query / Prefix Query / Wildcard Query
- 在ES中,Term 查詢,對輸入不做分詞。會將輸入作為一個整體,在倒排索引中查詢準確的詞項,並且使用相關度算分公式為每個包含該詞項的文件進行相關度算分- 例如“Apple Store”
- 可以通過Constant Score 將查詢轉換換成一個Filtering,避免算分,並利用快取,提交效能
Demo
- 插入資料
POST /products/_bulk
{ "index": { "_id": 1 }}
{ "productID" : "XHDK-A-1293-#fJ3","desc":"iPhone" }
{ "index": { "_id": 2 }}
{ "productID" : "KDKE-B-9947-#kL5","desc":"iPad" }
{ "index": { "_id": 3 }}
{ "productID" : "JODL-X-1937-#pV7","desc":"MBP" }
- 查詢
POST /products/_search
{
"query": {
"term": {
"desc.keyword": {
"value": "iPhone" //查不多資料,term查詢
//"value":"iphone" // 查到資料 term查詢會做分詞
}
}
}
}
POST /products/_search
{
"query": {
"term": {
"productID": {
"value": "XHDK-A-1293-#fJ3" // 無結果
"value": "xhdk" //有一條資料
"value": "xhdk-a-1293-#fj3"
}
}
}
}
//如果對值進行查詢
POST /products/_search
{
//"explain": true,
"query": {
"term": {
"productID.keyword": {
"value": "XHDK-A-1293-#fJ3"
}
}
}
}
- 將Query 轉成 Filter,忽略TF-IDF計算,避免相關性算分的開銷
- Filter 可以有效利用快取
POST /products/_search
{
"explain": true,
"query": {
"constant_score": {
"filter": {
"term": {
"productID.keyword": "XHDK-A-1293-#fJ3"
}
}
}
}
}
- 基於全文字的查詢
- Match Query / Match Phrase Query / Query String Query
- 特點
- 索引和搜尋時會進行分詞,查詢字串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
- 查詢時候,先會對輸入的查詢進行分詞。然後每個詞項逐個進行底層的查詢,最終將結果進行合併。並未每個文件生成一個算分。 例如查“Martix reloaded”,會查到包括 Matrix或者 reload的所有結果。
Match Query Result
POST movies/_search
{
"query":{
"match": {
"title":{
"query": "Matrix reloaded"
}
}
}
}
Operator
POST movies/_search
{
"query":{
"match": {
"title":{
"query": "Matrix reloaded",
"operator":"AND"
}
}
}
}
Minimun_should_match
POST movies/_search
{
"query":{
"match": {
"title":{
"query": "Matrix reloaded",
"minimum_should_match":2"
}
}
}
}
Match Phrase Query
POST movies/_search
{
"profile":true,
"query":{
"match_phrase": {
"title":{
"query": "Matrix reloaded",
"slop":1"
}
}
}
}
Match Query 查詢過程
- 基於全文字的查詢
- Match Query / Match Phrase Query / Query String Query
- 基於全文字的查詢的特點
- 索引和搜尋時都會進行分詞,查詢字串先傳遞到一個合適的分詞器,然後生成一個供查詢的詞項列表
- 查詢會對每個詞項逐個進行底層的查詢,再將結果進行合併,並未每個文件生成一個算分
- 基於詞項的查詢 vs 基於全文的查詢
- 通過欄位 Mapping 控制欄位的分詞
- 通過引數控制查詢的Precision & Recall
- 複合查詢
- 即使是對Keyword 進行Term 查詢,同樣會進行算分
- 可以將查詢轉為Filtering,取消相關性算分的環節,以提高效能