2013-08-30 18 views
11

Skonfigurowałem moją implementację Elastic Search, aby obliczyć wyniki według identyfikatora w odwzorowaniu, a kiedy wyświetlam ten aspekt użytkownikowi, muszę mieć możliwość wyświetlania czytelnej dla człowieka nazwy, która go reprezentuje. Dane, których potrzebuję, są obecne w mapowaniu, ale nie jestem pewien, w jaki sposób mogę je zwrócić jako część aspektu. Z pewnością jest to możliwe?ElasticSearch dodatkowe dane aspektu

Biorąc pod uwagę następujący przykład, chciałbym do aspektu dać mi jakiś sposób, aby skorelować thingId do thingName (lub dowolny inny thing właściwości, które mogą być potrzebne):

mapowania

{ 
    thingId, 
    thingName 
} 

Facet Zapytanie

{ 
    "facets":{ 
    "things":{ "terms":{ "field":"thingId" } } 
    } 
}  

Wynik

{ 
    "hits":{ 
    "total":3, 
    "max_score":1.0, 
    "hits":[ 
     ... 
    ] 
    }, 
    "facets":{ 
    "things":{ 
     "_type":"terms", 
     "missing":0, 
     "total":3, 
     "other":0, 
     "terms":[ 
     { 
      "term":"5", 
      "count":1 
     }, 
     { 
      "term":"4", 
      "count":1 
     }, 
     { 
      "term":"2", 
      "count":1 
     } 
     ] 
    } 
    } 
} 

Edit

This answer dotyczące Solr sugeruje, że FACET zarówno właściwości (thingName i thingId) i wtedy pętlę nad obu zestawów wyników facet, zakładając, że kolejność elementów, które być takim samym. Nie wiem, jak wiarygodne by to było, ale jest to opcja.

Edycja 2

This answer sugeruje, że nie jest możliwe, aby robić to, co chcę bez łącząc dwa pola do pojedynczej wartości i szlifowaniem na tym: thingId|thingName. Nieidealny.

Edycja 3

This answer proponuje łączenie wartości razem do jednego pola i szlifowaniem w to (jak opisano powyżej), ale używa scenariusza użytkowania w celu uzyskania połączenia, a tym samym nie wymaga mi wskaźnika Połączone forma wartości. Nadal nie jest doskonały, ale wydaje się najmniej kłopotliwą opcją.

+0

Łącząc 'thingId' i' thingName' w jeden ciąg i podzielenie go na warstwa aplikacji nie jest wykluczona, ale naprawdę mam nadzieję, że istnieje lepsze rozwiązanie. –

+0

Myślę, że należy rozważyć, czy naprawdę trzeba użyć Id na aspekt. Dlaczego nie używasz thingName? Czy myślałeś o tym? –

+0

Używanie 'thingName' jest opcją, ale jest mniej idealne, ponieważ nie mogę zagwarantować, że' thingName' będzie unikalne. –

Odpowiedz

3

Jeśli nie jesteś zadowolony z używania terminów skrypty, to inną opcją byłoby użycie nested aggregations, zakładając, że możesz korzystać z wersji 1.0.0.

Twój agregacji będzie wtedy wyglądać tak:

{ 
    "query": { 
     "match_all": {} 
    }, 
    "aggs": { 
     "theIds": { 
      "terms" : { 
       "field": "thingId" 
      }, 
      "aggs":{ 
       "theNames": { 
        "terms": { 
         "field": "thingName" 
        } 
       } 
      } 
     } 
    } 
} 

a odpowiedź będzie coś takiego:

"aggregations": { 
     "theIds": { 
     "buckets": [ 
      { 
       "key": "1", 
       "doc_count": 5, 
       "theNames": { 
        "buckets": [ 
        { 
         "key": "AAA", 
         "doc_count": 3 
        }, 
        { 
         "key": "BBB", 
         "doc_count": 3 
        }, 
        { 
         "key": "CCC", 
         "doc_count": 2 
        } 
        ] 
       } 
      }, 
      { 
       "key": "2", 
       "doc_count": 2, 
       "theNames": { 
        "buckets": [ 
        { 
         "key": "AAA", 
         "doc_count": 2 
        } 
        ] 
       } 
      } 
     ] 
     } 
    } 
Powiązane problemy