elasticsearch-mathc和term的區分

elasticsearch和mysql在思想上是有不一樣的,elasticsearch有分詞一說,好比北京奧運分詞成北京奧運北京奧運。分詞要要考慮兩點,一個是查詢字符串要不要分詞,還有就是原存儲字段是否是精確值。mysql

1. match 查詢

不管你在任何字段上進行的是全文搜索仍是精確查詢,match 查詢是你可用的標準查詢。sql

`、若是你在一個全文字段上使用 match 查詢,在執行查詢前,它將用正確的分析器去分析查詢字符串:curl

{ "match": { "tweet": "About Search" }}

二、若是在一個精確值的字段上使用它, 例如數字、日期、布爾或者一個 NOT_ANALYZED 字符串字段,那麼它將會精確匹配給定的值:elasticsearch

{ "match": { "age":    26           }}
{ "match": { "date":   "2014-09-01" }}
{ "match": { "public": true         }}
{ "match": { "tag":    "full_text"  }}

match查詢會先對搜索詞進行分詞,分詞完畢後再逐個對分詞結果進行匹配,所以相比於term的精確搜索,match是分詞匹配搜索,match搜索還有兩個類似功能的變種,一個是match_phrase,一個是multi_matchurl

2. term 查詢

term是表明徹底匹配,也就是精確查詢,搜索前不會再對搜索詞進行分詞,因此咱們的搜索詞必須是文檔分詞集合中的一個。好比說咱們要找標題爲北京奧運的全部文檔spa

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
        "title":"北京奧運"
    }
  }
}'

將會獲得以下結果code

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 0.92055845,
    "hits": [
     {
        "_index": "index",
        "_type": "doc",
        "_id": "3",
        "_score": 0.92055845,
        "_source": {
           "content": "同一個世界同一個夢想",
           "title": "北京奧運",
           "tags": [
               "和平"
            ]
        }
      }
    ]
  }
}

搜索title包含北京或者奧運的,結果也同樣,可是若是你搜索詞爲京奧,或者北京奧這樣的,那麼搜索結果將爲空索引

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
      "total" : 5,
      "successful" : 5,
      "failed" : 0
  },
  "hits" : {
      "total" : 0,
      "max_score" : null,
      "hits" : [ ]
  }
}

3. match_phrase

match_phrase爲按短語搜索,match_phrase的搜索方式和match相似,先對搜索詞創建索引,並要求全部分詞必須在文檔中出現(像不像operator爲and的match查詢),除此以外,還必須知足分詞在文檔中出現的順序和搜索詞中一致且各搜索詞之間必須緊鄰,所以match_phrase也能夠叫作緊鄰搜索。文檔

因此,當咱們搜美國留給字符串

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query": {
    "match_phrase": {
        "content": "美國留給"
    }
  }
}'

如下內容美國留給伊拉克的是個爛攤子嗎是能夠搜索出來的

"_source" : {
        "content" : "美國留給伊拉克的是個爛攤子嗎",
        "title" : "標題",
        "tags" : [ "美國", "伊拉克", "爛攤子" ]
    }

可是咱們搜索留給美國美國伊拉克時,卻沒有搜索結果,由於第一個順序不對,第二個不是緊鄰(隔着留給)。

緊鄰對於匹配度要求較高,爲了減少精度增長可操做性,引入了slop參數。該參數能夠指定相隔多少個詞仍被算做匹配成功。以下,

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match_phrase": {
            "content": {
                "query": "美國伊拉克",
                "slop": "1"
            }
        }
    }
}'

當咱們將slop設置爲1時,下面文檔是能夠搜索到的

"_source" : {
    "content" : "美國留給伊拉克的是個爛攤子嗎",
    "title" : "標題",
    "tags" : [ "美國", "伊拉克", "爛攤子" ]
  }

須要注意的是,當slop的值過大時(超出文檔總分詞數),那麼分詞數據將能夠是隨意的,即跟operator爲and的match查詢效果同樣。好比咱們查詢

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match_phrase": {
            "content": {
                "query": "伊拉克美國",
                "slop": "12"
            }
        }
    }
}'

將會獲得與上面同樣的結果

4. multi_match

若是咱們但願兩個字段進行匹配,其中一個字段有這個文檔就知足的話,使用multi_match

{
  "query": {
    "multi_match": {
        "query" : "個人寶馬多少馬力",
        "fields" : ["title", "content"]
    }
  }
}

可是multi_match就涉及到匹配評分的問題了。

相關文章
相關標籤/搜索