/*
* (C) Copyright 2017 Nuxeo SA (http://nuxeo.com/) and others.
*
* Licensed 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.
*
* Contributors:
* Funsho David
*
*/
package org.nuxeo.elasticsearch.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.nuxeo.elasticsearch.ElasticSearchConstants.HIGHLIGHT_CTX_DATA;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.nuxeo.ecm.core.api.CoreSession;
import org.nuxeo.ecm.core.api.DocumentModel;
import org.nuxeo.ecm.core.api.DocumentModelList;
import org.nuxeo.ecm.core.api.blobholder.BlobHolder;
import org.nuxeo.ecm.core.api.impl.blob.StringBlob;
import org.nuxeo.ecm.core.work.api.WorkManager;
import org.nuxeo.elasticsearch.api.ElasticSearchAdmin;
import org.nuxeo.elasticsearch.api.ElasticSearchService;
import org.nuxeo.elasticsearch.query.NxQueryBuilder;
import org.nuxeo.runtime.test.runner.Features;
import org.nuxeo.runtime.test.runner.FeaturesRunner;
import org.nuxeo.runtime.test.runner.LocalDeploy;
import org.nuxeo.runtime.transaction.TransactionHelper;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* @since 9.1
*/
@RunWith(FeaturesRunner.class)
@Features({ RepositoryElasticSearchFeature.class })
@LocalDeploy("org.nuxeo.elasticsearch.core:elasticsearch-test-highlight-contrib.xml")
public class TestHighlight {
@Inject
protected CoreSession session;
@Inject
protected ElasticSearchService ess;
@Inject
protected ElasticSearchAdmin esa;
@Inject
protected WorkManager workManager;
public void waitForCompletion() throws Exception {
workManager.awaitCompletion(20, TimeUnit.SECONDS);
esa.prepareWaitForIndexing().get(20, TimeUnit.SECONDS);
esa.refresh();
}
public void startTransaction() {
if (!TransactionHelper.isTransactionActive()) {
TransactionHelper.startTransaction();
}
}
@Before
public void setUpMapping() throws Exception {
esa.initIndexes(true);
}
@Test
public void testHighlight() throws Exception {
DocumentModel doc = session.createDocumentModel("/", "highlight", "File");
doc.setPropertyValue("dc:title", "Search me");
BlobHolder holder = doc.getAdapter(BlobHolder.class);
holder.setBlob(new StringBlob("you know for search"));
session.createDocument(doc);
session.save();
DocumentModel doc2 = session.createDocumentModel("/", "highlight2", "File");
BlobHolder holder2 = doc2.getAdapter(BlobHolder.class);
holder2.setBlob(new StringBlob("test my search with highlight"));
session.createDocument(doc2);
session.save();
TransactionHelper.commitOrRollbackTransaction();
waitForCompletion();
TransactionHelper.startTransaction();
SearchRequestBuilder request = esa.getClient().prepareSearch("nxutest").setTypes("doc");
List<String> highlightFields = Arrays.asList("dc:title", "ecm:binarytext");
NxQueryBuilder queryBuilder = new NxQueryBuilder(session)
.nxql("SELECT * FROM Document WHERE ecm:fulltext='search'")
.highlight(highlightFields);
queryBuilder.updateRequest(request);
DocumentModelList ret = ess.query(queryBuilder);
assertEquals(2, ret.totalSize());
Map<String, List<String>> highlights = (Map<String, List<String>>) ret.get(0).getContextData(HIGHLIGHT_CTX_DATA);
assertEquals(2, highlights.size());
assertTrue(highlights.containsKey("dc:title"));
assertTrue(highlights.containsKey("ecm:binarytext"));
assertEquals("<em>Search</em> me", highlights.get("dc:title").get(0));
assertEquals("you know for <em>search</em>", highlights.get("ecm:binarytext").get(0));
Map<String, List<String>> highlights2 = (Map<String, List<String>>) ret.get(1).getContextData(HIGHLIGHT_CTX_DATA);
assertEquals("test my <em>search</em> with highlight", highlights2.get("ecm:binarytext").get(0));
}
@Test
public void testMultipleHighlights() throws Exception {
startTransaction();
DocumentModel doc = session.createDocumentModel("/", "multipleHighlights", "File");
BlobHolder holder = doc.getAdapter(BlobHolder.class);
String content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. "
+ "Donec sed diam nec ante auctor tempor. Aliquam placerat porta lectus sit amet convallis. "
+ "Nam vel tincidunt nunc. Nullam leo tortor, tristique non consectetur sit amet, auctor vel justo. "
+ "Donec euismod congue lacus, ac volutpat magna dapibus at. Cras tincidunt fringilla sem, "
+ "et rhoncus leo aliquet sit amet. Aenean vel euismod risus, eu rhoncus erat. Nulla neque dui, "
+ "egestas sit amet nibh eget, maximus vehicula nisi.\n"
+ "Aenean non eros id mauris imperdiet tristique. Fusce bibendum convallis magna in varius. "
+ "Nullam eu ornare libero. Maecenas dignissim gravida lobortis. Nunc id pellentesque lorem. "
+ "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; "
+ "Fusce nec ipsum accumsan, tincidunt mi et, luctus turpis.\n"
+ "Suspendisse consequat erat vitae felis pulvinar congue. Phasellus ullamcorper, "
+ "massa at convallis molestie, diam turpis ornare diam, ac rutrum diam odio vel dolor. "
+ "Fusce facilisis a risus a molestie. Ut nulla diam, luctus et bibendum ut, gravida id justo. "
+ "Proin ipsum sem, rhoncus et nisi a, pellentesque consectetur quam. "
+ "Vestibulum dignissim pulvinar ipsum a accumsan. Nam nulla risus, pretium eget pellentesque pulvinar, "
+ "scelerisque vel ante. Vivamus viverra erat diam, non mollis arcu elementum in. "
+ "Nunc rutrum feugiat orci et auctor. Aliquam a quam felis. Sed aliquet vel orci ut tincidunt. "
+ "Aenean id porttitor nisi.\n"
+ "Aliquam erat volutpat. Aliquam et metus at arcu lobortis gravida in nec mauris. Aenean quam risus, "
+ "vestibulum sed mattis ac, lobortis quis nunc. Nam eu est nunc. Proin ac libero vehicula, "
+ "mollis turpis quis, tempus sem. Donec vehicula, ante eget porttitor hendrerit, "
+ "orci nibh rhoncus turpis, vel tempor turpis dui eget turpis. Mauris efficitur purus nibh, "
+ "et tincidunt leo iaculis sit amet. Suspendisse at augue ut eros congue posuere. "
+ "Morbi at suscipit augue. Morbi tincidunt eros eu rutrum semper.\n"
+ "Nam auctor, enim vel lacinia vehicula, leo leo porttitor massa, in blandit tortor ante quis ligula."
+ " Proin et interdum metus. Cras feugiat consectetur ornare. Phasellus ante nibh, "
+ "tincidunt ut venenatis sit amet, condimentum ac lacus. Maecenas ullamcorper aliquet turpis, "
+ "eu rutrum purus tempus in. Vivamus volutpat erat a odio pharetra, sed volutpat elit congue. "
+ "Mauris sit amet condimentum mi. Pellentesque est libero, tempus et elementum id, imperdiet ut risus."
+ " Suspendisse eu lorem metus. Mauris tempus quis lectus sit amet hendrerit.";
holder.setBlob(new StringBlob(content));
session.createDocument(doc);
session.save();
TransactionHelper.commitOrRollbackTransaction();
waitForCompletion();
TransactionHelper.startTransaction();
SearchRequestBuilder request = esa.getClient().prepareSearch("nxutest").setTypes("doc");
List<String> highlightFields = Arrays.asList("dc:title", "ecm:binarytext");
NxQueryBuilder queryBuilder = new NxQueryBuilder(session)
.nxql("SELECT * FROM Document WHERE ecm:fulltext='vehicula'")
.highlight(highlightFields);
queryBuilder.updateRequest(request);
DocumentModelList ret = ess.query(queryBuilder);
assertEquals(1, ret.totalSize());
Map<String, List<String>> highlights = (Map<String, List<String>>) ret.get(0).getContextData(HIGHLIGHT_CTX_DATA);
assertEquals(1, highlights.size());
assertEquals(3, highlights.get("ecm:binarytext").size());
assertEquals(
" neque dui egestas sit amet nibh eget maximus <em>vehicula</em> nisi aenean non eros id mauris imperdiet",
highlights.get("ecm:binarytext").get(0));
assertEquals(
" lobortis quis nunc nam eu est nunc proin ac libero <em>vehicula</em> mollis turpis quis tempus sem donec <em>vehicula</em>",
highlights.get("ecm:binarytext").get(1));
assertEquals(
" morbi at suscipit augue morbi tincidunt eros eu rutrum semper nam auctor enim vel lacinia <em>vehicula</em> leo",
highlights.get("ecm:binarytext").get(2));
}
}