如何以编程方式(在Java中)检索Elasticsearch中的术语向量?

时间:2016-03-11 15:34:21

标签: java vector elasticsearch term

我对ES很陌生,但在谷歌搜索一段时间之后,我还没有找到任何示例如何使用术语向量设置ES索引,并在以后通过文档ID以编程方式检索它们。< / p>

此处描述的JSON变体正在运行:https://www.elastic.co/guide/en/elasticsearch/reference/2.2/docs-termvectors.html

任何人都可以提供Java&#34;翻译&#34;对此?

目前,我像这样创建索引:

CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate(indexName);
createIndexRequestBuilder.execute().actionGet(); 

并添加如下文档:

XContentBuilder sourceBuilder;
sourceBuilder = XContentFactory.jsonBuilder().startObject()
                .field("text", text)
                .field("type", "testType");
IndexRequest request = new IndexRequest(indexName, esContentType).source(sourceBuilder);
client.index(request);

这是我再次获取文档的方式:

GetResponse response = client.prepareGet(indexName, esContentType, id).execute().actionGet();

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

好的,我终于找到了我想要的东西(这个link也很有帮助)。因为它可能对其他人有帮助,我想在此分享:

像这样创建索引:

CreateIndexRequestBuilder createIndexRequestBuilder = client.admin().indices().prepareCreate("indexName");
createIndexRequestBuilder.execute().actionGet(); 

try {
    client.admin().indices().preparePutMapping("indexName").setType("docType")
        .setSource(XContentFactory.jsonBuilder().prettyPrint()
        .startObject()
            .startObject("docType")
            .startObject("properties")
                .startObject("text").field("type", "string").field("index", "not_analyzed").field("term_vector", "yes").endObject()
            .endObject()
            .endObject()
        .endObject())
    .execute().actionGet();
} catch (IOException e) ...

以下是如何从ES中取回术语向量:

TermVectorsResponse resp = client.prepareTermVectors().setIndex("indexName")
                          .setType("docType").setId("docId").execute().actionGet();

XContentBuilder builder;
try {
    builder = XContentFactory.jsonBuilder().startObject();
    resp.toXContent(builder, ToXContent.EMPTY_PARAMS);
    builder.endObject();
    System.out.println(builder.string());
} catch (IOException e) ...

到目前为止,这对我有用,但如果有人有其他或更好的解决方案,请随时分享。

答案 1 :(得分:0)

要获得条款我们解析TermsVectorResponse,如下所示:

import org.apache.lucene.index.Fields;
import org.apache.lucene.index.Terms;
import org.apache.lucene.index.TermsEnum;
import org.apache.lucene.util.BytesRef;
import org.elasticsearch.action.termvectors.TermVectorsResponse;

...

public List<String> getTerms(TermVectorsResponse resp){

    List<String> termStrings = new ArrayList<>();
    Fields fields = resp.getFields();
    Iterator<String> iterator = fields.iterator();
    while (iterator.hasNext()) {
        String field = iterator.next();
        Terms terms = fields.terms(field);
        TermsEnum termsEnum = terms.iterator();
        while(termsEnum.next() != null){
            BytesRef term = termsEnum.term();
            if (term != null) {
                termStrings.add(term.utf8ToString());
            }
        }
    }
    return termStrings;
}

TermsEnum对象提供了进一步获取当前术语的聚合值的方法。如果您需要不同文档的值(例如每个文档的术语频率),您可能使用termsEnum.postings(...)来检索它们。

我们将Elastic 2.3与Lucene 5.5.0一起使用