2012-11-01 17 views
19

Jak mogę mieć żetony danej dziedzinie zwracane w wynikuelasticsearch - Powrót tokeny pola

Na przykład, żądanie GET

curl -XGET 'http://localhost:9200/twitter/tweet/1' 

powraca

{ 
    "_index" : "twitter", 
    "_type" : "tweet", 
    "_id" : "1", 
    "_source" : { 
     "user" : "kimchy", 
     "postDate" : "2009-11-15T14:12:12", 
     "message" : "trying out Elastic Search" 
    } 
} 

Chciałbym, aby w polu "_source.message" znajdowały się wyniki:

Odpowiedz

27

Istnieje również inny sposób to zrobić za pomocą następującego script_fields skrypt:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "script_fields": { 
     "terms" : { 
      "script": "doc[field].values", 
      "params": { 
       "field": "message" 
      } 
     } 

    } 
}' 

Ważne jest, aby pamiętać, że ten skrypt zwraca rzeczywiste warunki, które zostały zindeksowane, ale także buforuje wszystkie wartości pól i na dużych indeksy mogą zużywać dużo pamięci. Tak więc, na dużych indeksów, to może być bardziej przydatne do pobierania wartości pól z przechowywanych pól lub źródła i ponownej analizy ich ponownie w locie za pomocą następującego MVEL skrypt:

import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; 
import java.io.StringReader; 

// Cache analyzer for further use 
cachedAnalyzer=(isdef cachedAnalyzer)?cachedAnalyzer:doc.mapperService().documentMapper(doc._type.value).mappers().indexAnalyzer(); 

terms=[]; 
// Get value from Fields Lookup 
//val=_fields[field].values; 

// Get value from Source Lookup 
val=_source[field]; 

if(val != null) { 
    tokenStream=cachedAnalyzer.tokenStream(field, new StringReader(val)); 
    CharTermAttribute termAttribute = tokenStream.addAttribute(CharTermAttribute); 
    while(tokenStream.incrementToken()) { 
    terms.add(termAttribute.toString()) 
    }; 
    tokenStream.close(); 
} 
terms 

Ten skrypt MVEL mogą być przechowywane jako config/scripts/analyze.mvel i używane z następującym zapytaniem:

curl 'http://localhost:9200/test-idx/_search?pretty=true' -d '{ 
    "query" : { 
     "match_all" : { } 
    }, 
    "script_fields": { 
     "terms" : { 
      "script": "analyze", 
      "params": { 
       "field": "message" 
      } 
     } 

    } 
}' 
+3

To jest przerażające !!! Świetna odpowiedź! – javanna

+0

To jest przerażające, ale zabawne. :) Chciałbym móc uzyskać dostęp do IndexReader w DocLookup (jest tam, ale w tej chwili jest prywatny). Wtedy możliwe byłoby użycie wektorów termowych zamiast ponownej analizy tekstu za drugim razem. – imotov

+0

Tak, jasne. Czy nie byłoby miło również przeczytać wektory terminów bez skryptów, może poprzez wtyczkę? – javanna

6

Jeśli masz na myśli tok ens, które zostały zindeksowane, możesz zrobić terms facet w polu wiadomości. Zwiększ wartość size, aby uzyskać więcej wpisów, lub ustaw na 0, aby uzyskać wszystkie warunki.

Lucene umożliwia przechowywanie wektorów terminów, ale nie ma możliwości uzyskania dostępu do niego za pomocą elastycznego wyszukującego (o ile wiem).

Dlaczego tego potrzebujesz? Jeśli chcesz tylko sprawdzić, co indeksujesz, możesz rzucić okiem na analyze api.

+0

Fajnie, tego właśnie szukam. Dzięki – Kennedy

Powiązane problemy