2014年5月27日 星期二

[elasticsearch]且談 _all field 與 query default field




在談 "_all" 這個field 前 ,先看 elasitcserch 內的 default 的 search field。

當在使用 search 時,如果你的 query syntax 沒有指名說你要 search 哪個 field 時,預設的情況下,會 search 的欄位就是 "_all" 這個欄位就是預設的 default field。

(可以在 index.query.default_field 更改)

_all 這個欄位,其實就是 doc 欄位的集合。

如果你的應用是,document裡面的欄位都必須當成一個完整的term,也就是說,就算他們包含空白,在做 facet 呈現時也不希望把他們斷開成兩個字。

(還有另外一種處理方式就是使用 multi field ,也就是說從 raw data 索引後,可能有兩個以上的欄位表示同一個欄位,然後各自可以採用不同的 analyzer 跟 tokenizer 。)

這時候就可以充分的利用 _all 這個欄位的 analyzer 的設定。

PUT http://es_url/INDEX/
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "tokenizer": "keyword",
          "filter": "lowercase"
        }
      }
    }
  },
  "mappings": {
    "logs": {
      "_all": {
        "type": "string",
        "index": "analyzed",
        "analyzer": "standard"
      }
    }
  }
}

此處的 logs 表示的是  document type,可依照需求置換。

透過這樣的設定你就可以得到 search 欄位裡面的 結果,但是又有正確的 facet 效果。



kimchy
You don't want to set the analyzer for _all to be keyword, _all is an aggregation of all the other fields int the doc, so you basically treat the whole aggregation of text as a single token.
from ElasticSearch Users - Specifying analyzer for _all field
http://elasticsearch-users.115913.n3.nabble.com/Specifying-analyzer-for-all-field-td3851732.html

Its a copy of all the fields "aggregated" into the _all field.


_all
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-all-field.html




沒有留言:

張貼留言