2014年5月7日 星期三

[elasticsearch]從 type 談到 multi_field fields 與 solr scheme.xml mapping



使用 elasticsearch 時可以發現,他是個 "scheme-free" 的 search engine 。
但是不代表他沒有搜尋引擎的fields觀念。

在使用 elasticsearch api 的同時,在 put record 建立 index的過程中,我們透過 json record 與 elasticsearch http api 溝通,在此同時,json record 本來就已經把欄位與type 帶入。

也就是說,你在input record 的同時, elasticsearch 對 fileds 使用的 type 就是 json 有支援的 primitive data types 。
而json 本身支援的 core -type 就有  string, integer/long ,float/double ,boolean ,null 。
( JSON itself already provides us with some typing, with its support for stringinteger/longfloat/doubleboolean, and null.)

如果你對 index file 不設定他的filed mapping ,他就使用預設的 data type 。
(此處的 fileds mapping ,在solr 中 就是只對 欄位設定  scheme ,像是用什麼 "index": "not_analyzed", index 是否分析與 是否 store )

Multi Field Type

multi_field 就是用在一些比較特殊的需求上。
他允許同一個 field 可以映設與定義成多個 core type ,這是在實務上非常有用的一個配置。譬如,我們現在定義了一個 string的 type field ,可以這個 field 是需要被 analyzed 被分詞或是處理的,但是我們又同事希望這個 field 保有 not_analyzed 的屬性,這時候就可以透過設置 multi_field 來解決。

最下面是 kimchy 給出的一個例子,可以讓我們清楚看到 multi_field 的運作。
我們可以透過 name.untoched 去 操作該 field 。

我們在透過下面的 mapping 更仔細看 multi_field
{
    "tweet" : {
        "properties" : {
            "name" : {
                "type" : "multi_field",
                "fields" : {
                    "name" : {"type" : "string", "index" : "analyzed"},
                    "untouched" : {"type" : "string", "index" : "not_analyzed"}
                }
            }
        }
    }
}
name 同時被 mapping 成兩個 type,在實際物理上他們是建立兩個 lucene index segment 。


Multi Field Type
http://www.elasticsearch.org/guide/en/elasticsearch/reference/0.90/mapping-multi-field-type.html
elasticsearch - 向导 - Multi Field Type
http://www.elasticsearch.cn/guide/reference/mapping/multi-field-type.html

ElasticSearch Users - Searching on multi-field fields
http://elasticsearch-users.115913.n3.nabble.com/Searching-on-multi-field-fields-td3429284.html

gist:1296043
https://gist.github.com/kimchy/1296043

ex

curl -XPUT localhost:9200/test -d '{
    "mappings" : {
        "type1" : {
           "properties" : {
               "name" : {
                   "type" : "multi_field",
                   "fields" : {
                       "name" : {"type" : "string", "index" : "analyzed"},
                       "untouched" : {"type" : "string", "index" : "not_analyzed"}
                   }
               }
           }
        }
    }
}'

curl -XPUT localhost:9200/test/type1/1 -d '{
    "name" : "test me"
}'

curl -XPOST localhost:9200/test/_refresh  
curl -XGET localhost:9200/test/_search?q=name.untouched:*



沒有留言:

張貼留言