2012-10-29 9 views
11

Czy ktoś może mi powiedzieć, czy istnieje odpowiednik dyrektywy Solr copyField na ElasticSearch?Odpowiednik copyField of Solr na ElasticSearch?

Wiem, że istnieje typ wielopolowy: http://www.elasticsearch.org/guide/reference/mapping/multi-field-type.html Przyjemnie jest zastosować wiele analizatorów na tym samym polu.

Ale to nie jest dokładnie to samo. Solr zezwolenia na „scalić” kilka pól w jedno:

<field name="id" type="string" indexed="true" stored="true"/> 
<field name="name" type="string" indexed="true" stored="true"/> 
<field name="subject" type="string" indexed="true" stored="true"/> 
<field name="location" type="string" indexed="true" stored="true"/> 
<field name="all" type="text" indexed="true" stored="true" multiValued="true"/> 
<copyField source="*" dest="all"/> 

Wtyczka ta jest bardzo obiecująca: https://github.com/yakaz/elasticsearch-analysis-combo

ponieważ pozwala wrócić wyniki jako jednego pola podczas używania ElasticSearch pole o wielu wartościach. Ale nadal nie jest to dokładnie to samo, ponieważ nie pozwala "scalić" wielu pól.


Chciałbym połączenie obu analizatorów Combo i Solr copyField.

Mam model wpisu na blogu (pola tytułu/opisu) i chciałbym skopiować zarówno tytuł, jak i opis w jednym polu "blogContent", na którym zastosuję 2 różne analizatory.

Czy istnieje rozwiązanie ElasticSearch?

Odpowiedz

8

Istnieje special _all field, który domyślnie otrzymuje kopię wszystkich pozostałych pól. Możesz kontrolować włączenie do pola _all za pomocą atrybutu include_in_all. Jednak jesteś ograniczony do jednego takiego pola. Jeśli potrzebujesz więcej niż jeden, musisz obsłużyć go po stronie wyszukiwania, przeszukując wiele pól.

Jest również możliwe, aby osiągnąć funkcjonalność podobną do copyField za pomocą multi_field z atrybutem "path": "just_name":

curl -XPUT localhost:9200/test-idx -d '{ 
    "settings": { 
     "index": { 
      "number_of_shards": 1, 
      "number_of_replicas": 0 
     } 
    }, 
    "mappings": { 
     "doc": { 
      "properties": { 
       "first_name": { 
        "type": "multi_field", 
        "path": "just_name", 
        "fields": { 
         "first_name": {"type": "string", "index": "analyzed"}, 
         "name": {"type": "string","index": "analyzed"} 
        } 
       }, 
       "last_name": { 
        "type": "multi_field", 
        "path": "just_name", 
        "fields": { 
         "last_name": {"type": "string", "index": "analyzed"}, 
         "name": {"type": "string","index": "analyzed"} 
        } 
       } 
      } 
     } 
    } 
}' 
echo 
curl -XPUT localhost:9200/test-idx/doc/1 -d '{ 
    "first_name": "Sebastien", 
    "last_name": "Lorber" 
}' 
echo 
curl -XPOST localhost:9200/test-idx/_refresh 
echo 
curl "localhost:9200/test-idx/doc/_search?q=name:Sebastien" 
echo 
curl "localhost:9200/test-idx/doc/_search?q=name:Lorber" 
+0

Znam _all ale lepiej byłoby móc tworzyć wiele różnych _wszystko, jeśli to konieczne –

+1

Zgadzam się, byłoby miło mieć taką funkcję. Niestety, nie jest jeszcze zaimplementowany https://github.com/elasticsearch/elasticsearch/issues/1169 – imotov