2012-11-01 28 views
19

Làm thế nào tôi có thể có các thẻ của một lĩnh vực cụ thể trả lại trong kết quảelasticsearch - Trả lại thẻ của một trường

Ví dụ, A yêu cầu GET

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

lợi nhuận

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

Tôi muốn có mã thông báo của trường '_source.message' được bao gồm trong kết quả

Trả lời

27

Ngoài ra còn có một cách khác để làm điều đó bằng cách sử dụng script_fields kịch bản sau đây:

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

    } 
}' 

Điều quan trọng cần lưu ý là trong khi kịch bản này trả về các điều khoản thực tế đã được lập chỉ mục, nó cũng lưu trữ tất cả các giá trị trường và lớn chỉ số có thể sử dụng nhiều bộ nhớ. Vì vậy, trên các chỉ số lớn, nó có thể là hữu ích hơn để lấy giá trị trường từ lĩnh vực lưu trữ hoặc nguồn và reparse chúng một lần nữa một cách nhanh chóng bằng cách sử dụng sau đây MVEL kịch bản:

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 

kịch bản MVEL này có thể được lưu trữ như config/scripts/analyze.mvel và sử dụng với truy vấn sau:

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

    } 
}' 
+3

Điều này thật đáng sợ !!! Câu trả lời chính xác! – javanna

+0

Đó là đáng sợ, nhưng vui vẻ. :) Tôi muốn nó có thể truy cập vào IndexReader trong DocLookup (nó ở đó, nhưng nó là riêng tư vào lúc này). Sau đó, nó sẽ có thể sử dụng vectơ hạn thay vì tái phân tích văn bản lần thứ hai. – imotov

+0

Vâng, chắc chắn rồi. Nó sẽ không được tốt đẹp cũng để đọc các vectơ hạn mà không có kịch bản, có thể thông qua một plugin? – javanna

6

Nếu bạn muốn nói tok ens đã được lập chỉ mục, bạn có thể tạo một terms facet trên trường thông báo. Tăng giá trị size để nhận thêm các mục nhập trở lại hoặc đặt thành 0 để nhận tất cả các điều khoản.

Lucene cung cấp khả năng lưu trữ các vectơ thuật ngữ, nhưng không có cách nào để có quyền truy cập vào nó với elasticsearch bây giờ (theo như tôi biết).

Tại sao bạn cần điều đó? Nếu bạn chỉ muốn kiểm tra những gì bạn đang lập chỉ mục, bạn có thể xem qua số analyze api.

+0

Tốt, đây là những gì tôi đang tìm kiếm. Cảm ơn – Kennedy

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