elasticsearch,Java,Search,Lucene,Token,elasticsearch" /> elasticsearch,Java,Search,Lucene,Token,elasticsearch" />

Java elasticsearch-返回字段的标记

Java elasticsearch-返回字段的标记,java,search,lucene,token,elasticsearch,Java,Search,Lucene,Token,elasticsearch,如何在结果中返回特定字段的标记 例如,GET请求 curl -XGET 'http://localhost:9200/twitter/tweet/1' 返回 { "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_source" : { "user" : "kimchy", "postDate" : "2009-11-15T14:12:12", "mes

如何在结果中返回特定字段的标记

例如,GET请求

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

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

我希望在结果中包含“\u source.message”字段的标记

如果您指的是已编制索引的标记,则可以在消息字段中创建标记。增加
size
值以获取更多条目,或设置为
0
以获取所有术语

Lucene提供了存储术语向量的能力,但目前还无法通过elasticsearch访问它(据我所知)


你为什么需要这个?如果您只想检查正在编制索引的内容,可以查看。

还有另一种方法,可以使用以下脚本执行此操作:

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

    }
}'
需要注意的是,虽然此脚本返回已编制索引的实际术语,但它还缓存所有字段值,并且在大型索引上可能会使用大量内存。因此,对于大型索引,从存储的字段或源中检索字段值并使用以下MVEL脚本动态重新分析它们可能更有用:

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
此MVEL脚本可以存储为
config/scripts/analyze.MVEL
,并与以下查询一起使用:

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

很好,这就是我要找的。ThanksIt很吓人,但很有趣。:)我希望能够在DocLookup中访问IndexReader(它在那里,但目前是私有的)。那么就有可能使用术语向量,而不是第二次重新分析文本。是的,当然。如果不使用脚本,也可以通过插件来阅读术语向量,那不是很好吗?@imotov有没有办法从这个脚本中自动获取字段的正确分析器和字段类型?我想在Please add tokenStream.reset()中使用此功能;在while循环之前(否则我的设置会失败)。我认为如果不在elasticsearch 5.0及更高版本中编写插件,这是不可能实现的。