2014-08-29 7 views
11

Mit der Highlight-Funktion von Elasticsearch:für mehrwertig Felder

"highlight": { 
    "fields": { 
    "tags": { "number_of_fragments": 0 } 
    } 
} 

Mit number_of_fragments: 0 werden keine Fragmente erzeugt, sondern der ganze Inhalt des Feldes zurückgeführt wird. Dies ist nützlich für kurze Texte, da Dokumente normal angezeigt werden können und Personen leicht nach hervorgehobenen Teilen suchen können.

Wie verwenden Sie das, wenn ein Dokument ein Array mit mehreren Werten enthält?

PUT /test/doc/1 
{ 
    "tags": [ 
    "one hit tag", 
    "two foo tag", 
    "three hit tag", 
    "four foo tag" 
    ] 
} 

GET /test/doc/_search 
{ 
    "query": { 
    "match": { "tags": "hit"} 
    }, 
    "highlight": { 
    "fields": { 
     "tags": { "number_of_fragments": 0 } 
    } 
    } 
} 

Nun, was ich möchte den Benutzer zeigen:

1 Ergebnis:

Dokument 1 mit dem Stichwort:

"ein Hit Tages", „zwei foo tag "," drei hit tag "," vier foo tag "

Leider ist dies das Ergebnis der Abfrage:

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 0.10848885, 
     "hits": [ 
      { 
       "_index": "test", 
       "_type": "doc", 
       "_id": "1", 
       "_score": 0.10848885, 
       "_source": { 
       "tags": [ 
        "one hit tag", 
        "two foo tag", 
        "three hit tag", 
        "four foo tag" 
       ] 
       }, 
       "highlight": { 
       "tags": [ 
        "one <em>hit</em> tag", 
        "three <em>hit</em> tag" 
       ] 
       } 
      } 
     ] 
    } 
    } 

Wie kann ich diese verwenden, um zu erhalten:

"tags": [ 
     "one <em>hit</em> tag", 
     "two foo tag", 
     "three <em>hit</em> tag", 
     "four foo tag" 
    ] 
+1

Immer noch nichts dabei? Wie hast du dieses Problem gelöst? Ich habe das gleiche Problem. – vmeln

+0

Laut [dieser Ausgabe] (https://github.com/elastic/elasticsearch/issues/7416) fehlt diese Funktion noch ... –

Antwort

0

Eine Möglichkeit ist es, die <em> HTML-Tags aus den markierten Felder abzustreifen . schauen sie dann in dem ursprünglichen Feld oben:

tags = [ 
    "one hit tag", 
    "two foo tag", 
    "three hit tag", 
    "four foo tag" 
] 
highlighted = [ 
    "one <em>hit</em> tag", 
    "three <em>hit</em> tag", 
] 

highlighted.each do |highlighted_tag| 
    if (index = tags.index(highlighted_tag.gsub(/<\/?em>/, ''))) 
    tags[index] = highlighted_tag 
    end 
end 

puts tags #=> 
# one <em>hit</em> tag 
# two foo tag 
# three <em>hit</em> tag 
# four foo tag 

Dieser erhält nicht einen Preis für den schönsten Code, aber ich denke, es bekommt den Job getan.

+0

Verdeckt den Fall nicht, in dem derselbe Wert zweimal in den mehrwertigen Feld-Tags erscheint ". – mlangenberg

Verwandte Themen