Java tutorial
/* * Licensed to ElasticSearch and Shay Banon under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. ElasticSearch licenses this * file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.test.unit.termvectors; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.*; import org.apache.lucene.index.*; import org.apache.lucene.index.IndexWriterConfig.OpenMode; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.RAMDirectory; import org.elasticsearch.action.termvector.TermVectorRequest; import org.elasticsearch.action.termvector.TermVectorRequest.Flag; import org.elasticsearch.action.termvector.TermVectorResponse; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.io.stream.InputStreamStreamInput; import org.elasticsearch.common.io.stream.OutputStreamStreamOutput; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.rest.action.termvector.RestTermVectorAction; import org.hamcrest.Matchers; import org.junit.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.EnumSet; import java.util.Set; import static org.hamcrest.Matchers.equalTo; public class TermVectorUnitTests extends org.elasticsearch.test.integration.ElasticsearchTestCase { @Test public void streamResponse() throws Exception { TermVectorResponse outResponse = new TermVectorResponse("a", "b", "c"); outResponse.setExists(true); writeStandardTermVector(outResponse); // write ByteArrayOutputStream outBuffer = new ByteArrayOutputStream(); OutputStreamStreamOutput out = new OutputStreamStreamOutput(outBuffer); outResponse.writeTo(out); // read ByteArrayInputStream esInBuffer = new ByteArrayInputStream(outBuffer.toByteArray()); InputStreamStreamInput esBuffer = new InputStreamStreamInput(esInBuffer); TermVectorResponse inResponse = new TermVectorResponse("a", "b", "c"); inResponse.readFrom(esBuffer); // see if correct checkIfStandardTermVector(inResponse); outResponse = new TermVectorResponse("a", "b", "c"); writeEmptyTermVector(outResponse); // write outBuffer = new ByteArrayOutputStream(); out = new OutputStreamStreamOutput(outBuffer); outResponse.writeTo(out); // read esInBuffer = new ByteArrayInputStream(outBuffer.toByteArray()); esBuffer = new InputStreamStreamInput(esInBuffer); inResponse = new TermVectorResponse("a", "b", "c"); inResponse.readFrom(esBuffer); assertTrue(inResponse.isExists()); } private void writeEmptyTermVector(TermVectorResponse outResponse) throws IOException { Directory dir = new RAMDirectory(); IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new StandardAnalyzer(TEST_VERSION_CURRENT)); conf.setOpenMode(OpenMode.CREATE); IndexWriter writer = new IndexWriter(dir, conf); FieldType type = new FieldType(TextField.TYPE_STORED); type.setStoreTermVectorOffsets(true); type.setStoreTermVectorPayloads(false); type.setStoreTermVectorPositions(true); type.setStoreTermVectors(true); type.freeze(); Document d = new Document(); d.add(new Field("id", "abc", StringField.TYPE_STORED)); writer.updateDocument(new Term("id", "abc"), d); writer.commit(); writer.close(); DirectoryReader dr = DirectoryReader.open(dir); IndexSearcher s = new IndexSearcher(dr); TopDocs search = s.search(new TermQuery(new Term("id", "abc")), 1); ScoreDoc[] scoreDocs = search.scoreDocs; int doc = scoreDocs[0].doc; Fields fields = dr.getTermVectors(doc); EnumSet<Flag> flags = EnumSet.of(Flag.Positions, Flag.Offsets); outResponse.setFields(fields, null, flags, fields); outResponse.setExists(true); } private void writeStandardTermVector(TermVectorResponse outResponse) throws IOException { Directory dir = FSDirectory.open(new File("/tmp/foo")); IndexWriterConfig conf = new IndexWriterConfig(TEST_VERSION_CURRENT, new StandardAnalyzer(TEST_VERSION_CURRENT)); conf.setOpenMode(OpenMode.CREATE); IndexWriter writer = new IndexWriter(dir, conf); FieldType type = new FieldType(TextField.TYPE_STORED); type.setStoreTermVectorOffsets(true); type.setStoreTermVectorPayloads(false); type.setStoreTermVectorPositions(true); type.setStoreTermVectors(true); type.freeze(); Document d = new Document(); d.add(new Field("id", "abc", StringField.TYPE_STORED)); d.add(new Field("title", "the1 quick brown fox jumps over the1 lazy dog", type)); d.add(new Field("desc", "the1 quick brown fox jumps over the1 lazy dog", type)); writer.updateDocument(new Term("id", "abc"), d); writer.commit(); writer.close(); DirectoryReader dr = DirectoryReader.open(dir); IndexSearcher s = new IndexSearcher(dr); TopDocs search = s.search(new TermQuery(new Term("id", "abc")), 1); ScoreDoc[] scoreDocs = search.scoreDocs; int doc = scoreDocs[0].doc; Fields termVectors = dr.getTermVectors(doc); EnumSet<Flag> flags = EnumSet.of(Flag.Positions, Flag.Offsets); outResponse.setFields(termVectors, null, flags, termVectors); } private void checkIfStandardTermVector(TermVectorResponse inResponse) throws IOException { Fields fields = inResponse.getFields(); assertThat(fields.terms("title"), Matchers.notNullValue()); assertThat(fields.terms("desc"), Matchers.notNullValue()); assertThat(fields.size(), equalTo(2)); } @Test public void testRestRequestParsing() throws Exception { BytesReference inputBytes = new BytesArray( " {\"fields\" : [\"a\", \"b\",\"c\"], \"offsets\":false, \"positions\":false, \"payloads\":true}"); TermVectorRequest tvr = new TermVectorRequest(null, null, null); XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(inputBytes); TermVectorRequest.parseRequest(tvr, parser); Set<String> fields = tvr.selectedFields(); assertThat(fields.contains("a"), equalTo(true)); assertThat(fields.contains("b"), equalTo(true)); assertThat(fields.contains("c"), equalTo(true)); assertThat(tvr.offsets(), equalTo(false)); assertThat(tvr.positions(), equalTo(false)); assertThat(tvr.payloads(), equalTo(true)); String additionalFields = "b,c ,d, e "; RestTermVectorAction.addFieldStringsFromParameter(tvr, additionalFields); assertThat(tvr.selectedFields().size(), equalTo(5)); assertThat(fields.contains("d"), equalTo(true)); assertThat(fields.contains("e"), equalTo(true)); additionalFields = ""; RestTermVectorAction.addFieldStringsFromParameter(tvr, additionalFields); inputBytes = new BytesArray(" {\"offsets\":false, \"positions\":false, \"payloads\":true}"); tvr = new TermVectorRequest(null, null, null); parser = XContentFactory.xContent(XContentType.JSON).createParser(inputBytes); TermVectorRequest.parseRequest(tvr, parser); additionalFields = ""; RestTermVectorAction.addFieldStringsFromParameter(tvr, additionalFields); assertThat(tvr.selectedFields(), equalTo(null)); additionalFields = "b,c ,d, e "; RestTermVectorAction.addFieldStringsFromParameter(tvr, additionalFields); assertThat(tvr.selectedFields().size(), equalTo(4)); } @Test public void testRequestParsingThrowsException() throws Exception { BytesReference inputBytes = new BytesArray( " {\"fields\" : \"a, b,c \", \"offsets\":false, \"positions\":false, \"payloads\":true, \"meaningless_term\":2}"); TermVectorRequest tvr = new TermVectorRequest(null, null, null); boolean threwException = false; try { XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(inputBytes); TermVectorRequest.parseRequest(tvr, parser); } catch (Exception e) { threwException = true; } assertThat(threwException, equalTo(true)); } @Test public void streamRequest() throws IOException { for (int i = 0; i < 10; i++) { TermVectorRequest request = new TermVectorRequest("index", "type", "id"); request.offsets(randomBoolean()); request.fieldStatistics(randomBoolean()); request.payloads(randomBoolean()); request.positions(randomBoolean()); request.termStatistics(randomBoolean()); String parent = randomBoolean() ? "someParent" : null; request.parent(parent); String pref = randomBoolean() ? "somePreference" : null; request.preference(pref); // write ByteArrayOutputStream outBuffer = new ByteArrayOutputStream(); OutputStreamStreamOutput out = new OutputStreamStreamOutput(outBuffer); request.writeTo(out); // read ByteArrayInputStream esInBuffer = new ByteArrayInputStream(outBuffer.toByteArray()); InputStreamStreamInput esBuffer = new InputStreamStreamInput(esInBuffer); TermVectorRequest req2 = new TermVectorRequest(null, null, null); req2.readFrom(esBuffer); assertThat(request.offsets(), equalTo(req2.offsets())); assertThat(request.fieldStatistics(), equalTo(req2.fieldStatistics())); assertThat(request.payloads(), equalTo(req2.payloads())); assertThat(request.positions(), equalTo(req2.positions())); assertThat(request.termStatistics(), equalTo(req2.termStatistics())); assertThat(request.preference(), equalTo(pref)); assertThat(request.routing(), equalTo(parent)); } } }