2014-08-29 13 views
11

Sử dụng tính năng nổi bật của Elasticsearch:nổi bật toàn bộ nội dung trong Elasticsearch cho các lĩnh vực multivalue

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

Với number_of_fragments: 0, không có mảnh vỡ được sản xuất, nhưng toàn bộ nội dung của lĩnh vực này được trả về. Điều này rất hữu ích cho các văn bản ngắn, vì các tài liệu có thể được hiển thị như bình thường, và mọi người có thể dễ dàng quét các phần được đánh dấu.

Làm thế nào để bạn sử dụng điều này khi tài liệu chứa một mảng có nhiều giá trị?

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 } 
    } 
    } 
} 

Bây giờ những gì tôi muốn giới thiệu với người dùng:

1 kết quả:

Document 1, được gắn thẻ:

"một nhấn tag", "hai thẻ foo "," ba nhấn thẻ "," bốn thẻ foo "

Thật không may, đây là kết quả của truy vấn:

{ 
    "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" 
       ] 
       } 
      } 
     ] 
    } 
    } 

Làm thế nào tôi có thể sử dụng để có được:

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

Vẫn không có gì về điều này? Bạn đã giải quyết vấn đề này như thế nào? Tôi có cùng một vấn đề. – vmeln

+0

Theo [vấn đề này] (https://github.com/elastic/elasticsearch/issues/7416) tính năng này vẫn bị thiếu ... –

Trả lời

0

Một khả năng là dải <em> html-thẻ từ trường được tô sáng . Sau đó, tìm kiếm chúng trong trường gốc:

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 

Điều này không nhận được giá cho mã đẹp nhất, nhưng tôi cho rằng nó hoàn thành công việc.

+0

Không bí mật trường hợp cùng một giá trị xuất hiện hai lần trong thẻ trường đa giá trị '. – mlangenberg

Các vấn đề liên quan