2013-08-21 17 views
5

Czy ktoś mógłby mi doradzić, jak wykonać niestandardową punktację w ElasticSearch, szukając zestawu słów kluczowych z zestawu słów kluczowych?ElasticSearch Custom Scoring z tablicami

Na przykład, powiedzmy, że istnieje szereg słów kluczowych w każdym dokumencie, tak jak poniżej:

{ // doc 1 
    keywords : [ 
      red : { 
        weight : 1 
       }, 
      green : { 
        weight : 2.0 
       }, 
      blue : { 
        weight: 3.0 
       }, 
      yellow : { 
        weight: 4.3 
       } 
     ] 
}, 
{ // doc 2 
    keywords : [ 
      red : { 
        weight : 1.9 
       }, 
      pink : { 
        weight : 7.2 
       }, 
      white : { 
        weight: 3.1 
       }, 
     ] 
}, 
... 

I chcę, aby uzyskać wyniki dla każdej dokumentów oparty na poszukiwaniu, który pasuje słowo przeciwko tej tablicy:

{ 
    keywords : [ 
      red : { 
        weight : 2.2 
       }, 
      blue : { 
        weight : 3.3 
       }, 
     ] 
} 

Ale zamiast tylko ustalenia, czy są one zgodne, chcę użyć bardzo specyficzny algorytm Punktacja:

enter image description here

Zdobywanie pojedynczego pola jest łatwe, ale nie wiem, jak nim zarządzać za pomocą tablic. jakieś pomysły?

+0

Hi @Aleksi Asikainen, czy znalazłeś jakieś rozwiązanie tego problemu (używając elasticsearch)? –

+0

Obawiam się, że nie, ale w dzisiejszych czasach ElasticSearch ma lepsze funkcje wspomagania punktacji, co moim zdaniem może być wystarczająco dobre, aby to osiągnąć: http://www.elastic.co/guide/en/elasticsearch/reference/0.90/query-dsl- function-score-query.html –

Odpowiedz

1

Ah interesujące pytanie! (I jedno myślę, że możemy rozwiązać za pomocą jakiejś komunikacji)

Po pierwsze, czy spojrzałeś na punktowanie według własnego skryptu? Jestem pewien, że możesz to zrobić za pomocą tego powoli. Gdybyś to zrobił, rozważyłbym wykonanie rescore phase, gdzie punktacja jest obliczana tylko wtedy, gdy dokument jest znany jako trafienie.

Jednak myślę, że można to zrobić za pomocą maszyn elasticsearch. Jak mogę się domyślić, robisz kropkę między dokumentami (gdzie wagi są w rzeczywistości w połowie między tym, co określasz i 1).

Tak więc, moja pierwsza sugestia usuwa termin x/2n z "niestandardowej oceny" (produkt punktowy) i umieszcza wasze ciężary w połowie między 1 a niestandardową wagą (np. 1,9 => 1,45).

... Przykro mi, będę musiał wrócić i edytować to pytanie. Zastanawiałem się nad użyciem zagnieżdżonych dokumentów z podwyszonym poziomem pola, ale niestety, parametr odwzorowania jest only available for the root doc

p.s. Po prostu pomyślałeś, że możesz mieć pola z określonymi poziomami doładowania i przechowywać tam terminy, wtedy możesz to zrobić łatwo, ale tracisz precyzję. Dokument powinien wyglądać następująco:

{ 
    "boost_1": ["aquamarine"], 
    "boost_2": null, //don't need to send this, just showing for clarity 
    ... 
    "boost_5": ["burgundy", "fuschia"] 
    ... 
} 

Można wtedy zdefiniować te boostings w swoim mapowaniu. Należy zwrócić uwagę jest to pola zwiększyć wartość przenosi się do pola _all, więc teraz masz torbę względem ważonych w swojej dziedzinie _all, to można skonstruować bool: should zapytanie, z dużą ilością term zapytań o różnej doładowania (dla wagi drugiego dokumentu).

Daj mi znać, co myślisz! Bardzo, bardzo interesujące pytanie.

+0

Dzięki za długą odpowiedź. Sądzę, że masz rację, że punktacja musiałaby się odbyć w fazie cofania, jeśli w ogóle. Niestety, dostępnych jest bardzo niewiele informacji o tym, jak zrobić ponowne zapisywanie z tablicami, stąd pytanie ...W tej chwili mam wybrany do wyszukiwania za pomocą ElasticSearch a następnie przeprowadzenia punktacji wyników w PHP. To jest niezwykle rozrzutny chociaż, więc wolałbym przejść proces punktacji całkowicie w ElasticSearch. –