TermMatchingContext onFields = wildcard.onField(searchfields[0]); for (int i = 1; i < searchfields.length; i++) onFields.andField(searchfields[i]); TermTermination matching = onFields.matching(input.toLowerCase()); Query query = matching.createQuery();
/** * Builds a search query. * * @param fullTextSession the Hibernate Search session * @param searchText the search text * @param pageRequest contains information for pagination: page number, page size * @return the search query */ private FullTextQuery createSearchQuery( FullTextSession fullTextSession, String searchText, PageRequest pageRequest) { QueryBuilder queryBuilder = fullTextSession. getSearchFactory(). buildQueryBuilder(). forEntity(Topic.class). get(); org.apache.lucene.search.Query luceneQuery = queryBuilder. keyword(). onField(Topic.TOPIC_TITLE_FIELD_DEF). andField(Topic.TOPIC_TITLE_FIELD_RU). andField(Topic.TOPIC_POSTS_PREFIX + Post.POST_CONTENT_FIELD_DEF). andField(Topic.TOPIC_POSTS_PREFIX + Post.POST_CONTENT_FIELD_RU). matching(searchText). createQuery(); FullTextQuery query = fullTextSession.createFullTextQuery(luceneQuery); query.setFirstResult(pageRequest.getOffset()); query.setMaxResults(pageRequest.getPageSize()); return query; }
public void testKeyword() { loadTestingData(); Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().onField("name") .andField("blurb").matching("Eats").createQuery(); CacheQuery<Person> cacheQuery = Search.getSearchManager(cache).getQuery(query); List<Person> found = cacheQuery.list(); assertEquals(2, found.size()); person4 = new Person(); person4.setName("Some name with Eats"); person4.setBlurb("Description without keyword."); cache.put("someKey", person4); cacheQuery = Search.getSearchManager(cache).getQuery(query); found = cacheQuery.list(); assertEquals(3, found.size()); assert found.contains(person2); assert found.contains(person3); assert found.contains(person4); }
public void testFuzzyOnFieldsAndField() { loadTestingData(); Query query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy(). onField("name").matching("Goat").createQuery(); CacheQuery<Person> cacheQuery = Search.getSearchManager(cache).getQuery(query); List<Person> found = cacheQuery.list(); assertEquals(2, found.size()); assert found.contains(person2); assert found.contains(person3); person4 = new Person(); person4.setName("Test"); person4.setBlurb("Test goat"); cache.put("testKey", person4); query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy(). onField("name").andField("blurb").matching("goat").createQuery(); cacheQuery = Search.getSearchManager(cache).getQuery(query); found = cacheQuery.list(); assertEquals(3, found.size()); assert found.contains(person2); assert found.contains(person3); assert found.contains(person4); query = Search.getSearchManager(cache).buildQueryBuilderForClass(Person.class).get().keyword().fuzzy(). onFields("name", "blurb").matching("goat").createQuery(); List<?> foundOnFields = Search.getSearchManager(cache).getQuery(query).list(); assertEquals(3, found.size()); assert found.contains(person2); assert found.contains(person3); assert found.contains(person4); }
@Override @SuppressWarnings("unchecked") public SearchResult<Page> search(String term, int offset, int limit) { FullTextEntityManager fullTextEm = Search.getFullTextEntityManager( getEm() ); QueryBuilder queryBuilder = fullTextEm.getSearchFactory().buildQueryBuilder() .forEntity( Page.class ).get(); Query luceneQuery; if ( term == null || term.isEmpty() ) { luceneQuery = queryBuilder.all().createQuery(); } else { luceneQuery = queryBuilder.keyword() .onField( "title" ).boostedTo( 2.0f ) .andField( "content" ) .matching( term ) .createQuery(); } Sort scoreSort = queryBuilder.sort().byScore().createSort(); FullTextQuery query = fullTextEm.createFullTextQuery( luceneQuery, Page.class ) .setFirstResult( offset ) .setMaxResults( limit ) .setSort( scoreSort ); return new SearchResult<>( query.getResultSize(), query.getResultList() ); }
private FullTextQuery getSearchQuery(String searchTerm) { FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager()); QueryBuilder userQueryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder() .forEntity(User.class).get(); BooleanJunction<?> booleanJunction = userQueryBuilder.bool(); if (StringUtils.hasText(searchTerm)) { booleanJunction.must(userQueryBuilder .keyword() .fuzzy().withPrefixLength(1).withThreshold(0.8F) .onField(Binding.user().userName().getPath()) .andField(Binding.user().fullName().getPath()) .matching(searchTerm) .createQuery()); } else { booleanJunction.must(userQueryBuilder.all().createQuery()); } return fullTextEntityManager.createFullTextQuery(booleanJunction.createQuery(), User.class); }
@Test public void testMultipleFields() throws Exception { final QueryBuilder monthQb = helper.queryBuilder( Month.class ); //combined query, January and February both contain whitening but February in a longer text Query query = monthQb.keyword() .onField( "mythology" ) .andField( "history" ) .matching( "whitening" ) .createQuery(); helper.assertThat( query ).from( Month.class ).matchesExactlyIds( 1, 2 ); //combined query, January and February both contain whitening but February in a longer text query = monthQb.keyword() .onFields( "mythology", "history" ) .boostedTo( 30 ) .matching( "whitening" ).createQuery(); helper.assertThat( query ).from( Month.class ).matchesExactlyIds( 1, 2 ); //boosted query, January and February both contain whitening but February in a longer text //since history is boosted, February should come first though query = monthQb.keyword() .onField( "mythology" ) .andField( "history" ) .boostedTo( 30 ) .matching( "whitening" ) .createQuery(); helper.assertThat( query ).from( Month.class ).matchesExactlyIds( 2, 1 ); }
@Test public void testUseOfMultipleCustomFieldBridgeInstances() throws Exception { final QueryBuilder monthQb = helper.queryBuilder( Month.class ); //Rather complex code here as we're not exposing the #withFieldBridge methods on the public interface final ConnectedTermMatchingContext field1Context = (ConnectedTermMatchingContext) monthQb .keyword() .onField( MonthClassBridge.FIELD_NAME_1 ); final ConnectedTermMatchingContext field2Context = (ConnectedTermMatchingContext) field1Context .withFieldBridge( new String2FieldBridgeAdaptor( new RomanNumberFieldBridge() ) ) .andField( MonthClassBridge.FIELD_NAME_2 ); Query query = field2Context .withFieldBridge( new String2FieldBridgeAdaptor( new RomanNumberFieldBridge() ) ) .matching( 2 ) .createQuery(); helper.assertThat( query ).from( Month.class ).hasResultSize( 1 ); }
private FullTextQuery getSearchByNameQuery(String searchTerm, ArtifactDeprecationStatus deprecation) { FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager()); QueryBuilder artifactQueryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder() .forEntity(Artifact.class).get(); BooleanJunction<?> booleanJunction = artifactQueryBuilder.bool(); if (deprecation != null) { booleanJunction.must(artifactQueryBuilder .keyword() .onField(Binding.artifact().deprecationStatus().getPath()) .matching(deprecation) .createQuery()); } if (StringUtils.hasText(searchTerm)) { booleanJunction.must(artifactQueryBuilder .keyword() .fuzzy().withPrefixLength(1).withThreshold(0.8F) .onField(Binding.artifact().artifactId().getPath()) .andField(Binding.artifact().group().groupId().getPath()) .matching(searchTerm) .createQuery()); } else { booleanJunction.must(artifactQueryBuilder.all().createQuery()); } return fullTextEntityManager.createFullTextQuery(booleanJunction.createQuery(), Artifact.class); }