我对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();
非常感谢任何帮助。
答案 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一起使用