0

I am using the following function to get the term vector for some set of IDs.

public static void builtTermVectorRequest(Client client, String index, Map<String, String> postIDs) { TermVectorsRequest termVectorsRequest = new TermVectorsRequest(); termVectorsRequest.index(index).type("post"); for (Map.Entry<String, String> entry : postIDs.entrySet()) { String currentPostId = entry.getKey(); String currentParentID = entry.getValue(); termVectorsRequest .id(currentPostId) .parent(currentParentID) .termStatistics(true) .selectedFields("content"); } MultiTermVectorsRequestBuilder mtbuilder = client.prepareMultiTermVectors(); mtbuilder.add(termVectorsRequest); MultiTermVectorsResponse response = mtbuilder.execute().actionGet(); XContentBuilder builder; try { builder = XContentFactory.jsonBuilder().startObject(); response.toXContent(builder, ToXContent.EMPTY_PARAMS); builder.endObject(); System.out.println(builder.prettyPrint().string()); } catch (IOException e) {} } 

Here I have some document IDs along with their parent IDs as the documents are child documents.

I get that the documents were not found even when they exist.

To confirm I tried the same thing in Python using:

body = dict(docs=map(lambda x: { "fields": ["content"], "_id": x["_id"], "_routing": x["_routing"], "term_statistics": "true" }, result["hits"]["hits"])) es_client = elasticsearch.Elasticsearch([{'host': '192.168.111.12', 'port': 9200}]) all_term_vectors = es_client.mtermvectors( index="prf_test", doc_type="post", body=body ) 

and I get results back.

What is wrong with the Java code?

3
  • looks like some routing issue is x["_routing"] same as ParentId if so could you explicitly try .routing(currentParentID) ? Commented Jun 26, 2016 at 15:41
  • @keety Sorry for not following up. I was getting the same issue even after that I tried with some more combinations and finally got it to work. You can view my answer. Commented Jun 27, 2016 at 18:28
  • cool nice to know thanks Commented Jun 27, 2016 at 18:43

1 Answer 1

3

I tried out more combinations on how to use TermVectorsRequest with MultiTermVectorsRequestBuilder and finally came to the following solution which works:

/** * Prints term-vectors for child documents given their parent ids * * @param client Es client * @param index Index name * @param postIDs Map of child document ID to its _parent/_routing ID */ public static void builtTermVectorRequest(Client client, String index, Map<String, String> postIDs) { /** * Initialize the MultiTermVectorsRequestBuilder first */ MultiTermVectorsRequestBuilder multiTermVectorsRequestBuilder = client.prepareMultiTermVectors(); /** * For every document ID, create a different TermVectorsRequest and * add it to the MultiTermVectorsRequestBuilder created above */ for (Map.Entry<String, String> entry : postIDs.entrySet()) { String currentPostId = entry.getKey(); String currentRoutingID = entry.getValue(); TermVectorsRequest termVectorsRequest = new TermVectorsRequest() .index(index) .type("doc_type") .id(currentPostId) .parent(currentRoutingID) // You can use .routing(currentRoutingID) also .selectedFields("some_field") .termStatistics(true); multiTermVectorsRequestBuilder.add(termVectorsRequest); } /** * Finally execute the MultiTermVectorsRequestBuilder */ MultiTermVectorsResponse response = multiTermVectorsRequestBuilder.execute().actionGet(); XContentBuilder builder; try { builder = XContentFactory.jsonBuilder().startObject(); response.toXContent(builder, ToXContent.EMPTY_PARAMS); builder.endObject(); System.out.println(builder.prettyPrint().string()); } catch (IOException e) { } } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.