Elasticsearch(入門(mén)篇)——全文檢索(一)、全文VS短語(yǔ)

前言

關(guān)于倒排索引等內(nèi)容,將不做介紹,可以看<a href="">《Elasticsearch權(quán)威指南》</a>更多內(nèi)容:<a href="">ELK修煉之道</a>

短語(yǔ) vs 全文

雖然所有的查詢都會(huì)進(jìn)行相關(guān)度計(jì)算,但不是所有的查詢都會(huì)有分析階段。而且像boolfunction_score這樣的查詢并不在文本字段執(zhí)行分析。

1、基于短語(yǔ)(Term-based)的查詢:
term(在filter上下文中)或fuzzy一類的查詢是低級(jí)查詢,它們沒(méi)有分析階段。這些查詢?cè)趩我坏亩陶Z(yǔ)上執(zhí)行。例如對(duì)單詞Footerm查詢會(huì)在倒排索引里精確查找Foo這個(gè)詞,并對(duì)每個(gè)包含這個(gè)單詞的文檔計(jì)算TF/IDF相關(guān)度_score
term查詢只在倒排查詢里精確低查找特定短語(yǔ),而不會(huì)匹配短語(yǔ)的其它變形,如FooFOO。不管短語(yǔ)怎樣被加入索引,都只匹配倒排索引里的準(zhǔn)確值。如果你在一個(gè)設(shè)置了not_analyzed的字段為["Foo", "Bar"]建索引,或者在一個(gè)用whitespace解析器解析的字段為Foo Bar建索引,都會(huì)在倒排索引里加入兩個(gè)索引FooBar

2、全文(Full-text)檢索
matchquery_string這樣的查詢是高級(jí)查詢,他們會(huì)對(duì)字段進(jìn)行分析:

  • 如果檢索一個(gè)dateinteger字段,他們會(huì)把查詢語(yǔ)句作為日期或者整數(shù)格式數(shù)據(jù)。
  • 如果檢索一個(gè)精確值(not_analyzed)字符串字段,他們會(huì)把整個(gè)查詢語(yǔ)句作為一個(gè)短語(yǔ)。
  • 如果檢索一個(gè)全文(analyzed)字段,查詢會(huì)先用適當(dāng)?shù)慕馕銎鹘馕霾樵冋Z(yǔ)句,產(chǎn)生需要查詢的短語(yǔ)列表。然后對(duì)列表中的每個(gè)短語(yǔ)執(zhí)行低級(jí)查詢,合并查詢結(jié)果,得到最終的文檔相關(guān)度。

全文檢索

全文檢索最重要的兩個(gè)方面:

  • 相關(guān)度(Relevance)
    根據(jù)文檔與查詢相關(guān)程度對(duì)結(jié)果進(jìn)行排序的能力。相關(guān)度可以使用TF/IDF,地理位置相近程度、模糊相似度或其他算法計(jì)算。
  • 分析(Analysis)
    將一段文本轉(zhuǎn)換成一組唯一的、標(biāo)準(zhǔn)化了的標(biāo)詞(term),用以(a)創(chuàng)建倒排索引,(b)查詢倒排索引

注意:
一旦我們提到相關(guān)度和分析,指的都是查詢(queries)而非過(guò)濾器(filters)

//驗(yàn)證match查詢也不一定全部要做分析
PUT my_index3/
{
  "mappings" : {
    "my_type" : {
    "properties" : {
      "message" : {
        "type" : "string",
        "index" : "analyzed"
      }
      "message1" : {
        "type" : "string",
        "index" : "not_analyzed"
      }
    } 
  }
  }
}
//索引一條數(shù)據(jù)
POST my_index3/my_type
{
  "message" : "boy",
  "message1" : "boy"
}

POST /my_index3/my_type/_search
{
  "query": {
    "filtered": {
      "filter": {
        "match": {
          "message1": "BOY"
        }
      }
    }
  }
}
//response
{
  "took": 2,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 0,
    "max_score": null,
    "hits": []
  }
}

//同樣的查詢message1就可以查到了

在很少的情況下,你可能才需要使用基于詞條的查詢(Term-based Queries)。通常你需要查詢的是全文,而不是獨(dú)立的詞條,而這個(gè)
工作通過(guò)高級(jí)的全文查詢來(lái)完成會(huì)更加容易(在內(nèi)部它們最終還是使用的基于詞條的低級(jí)查詢)。

match查詢

先來(lái)個(gè)例子入門(mén)說(shuō)明match查詢的步驟:

{
    "match" : {
        "message" : "BOY"
    }
}

Elasticsearch通過(guò)執(zhí)行下面的步驟執(zhí)行match查詢:

  1. 檢查field類型
    ? ? ? ?message字段是一個(gè)字符串(analyzed),所以該查詢字符串也需要被分析(analysis)
  2. 分析查詢字符串
    ? ? ? ?查詢?cè)~boy。因?yàn)槲覀冎挥幸粋€(gè)查詢?cè)~,因此match查詢可以以一種低級(jí)別的term查詢的方式執(zhí)行。
  3. 找到匹配的文檔
    ? ? ? ?term查詢?cè)诘古潘饕兴阉?code>boy,并且返回包含該詞的文檔。
  4. 為每個(gè)文檔打分
    ? ? ? ?term查詢綜合考慮詞頻(每篇文檔message字段包含boy的次數(shù))、逆文檔頻率(在全部文檔中message字段boy的次數(shù))、包含boy的字段長(zhǎng)度(長(zhǎng)度越短越相關(guān))來(lái)計(jì)算每篇文檔的相關(guān)性得分_score。

參考

<a >TF-IDF與余弦相似性的應(yīng)用:阮一峰</a>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容