You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sl...@apache.org on 2019/04/17 18:27:25 UTC

[maven-indexer] branch MINDEXER-115 created (now dbc981d)

This is an automated email from the ASF dual-hosted git repository.

slachiewicz pushed a change to branch MINDEXER-115
in repository https://gitbox.apache.org/repos/asf/maven-indexer.git.


      at dbc981d  [MINDEXER-115] Migrate to BooleanQuery.Builder

This branch includes the following new commits:

     new dbc981d  [MINDEXER-115] Migrate to BooleanQuery.Builder

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-indexer] 01/01: [MINDEXER-115] Migrate to BooleanQuery.Builder

Posted by sl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

slachiewicz pushed a commit to branch MINDEXER-115
in repository https://gitbox.apache.org/repos/asf/maven-indexer.git

commit dbc981d2269a539c782a70e6016b5a2acbc4cb0e
Author: Sylwester Lachiewicz <sl...@apache.org>
AuthorDate: Sat Apr 6 22:08:18 2019 +0200

    [MINDEXER-115] Migrate to BooleanQuery.Builder
    
    Remove deprecated usages of BooleanQuery constructor - use Builder
    
    Based on Sopot Cela changes
---
 .../apache/maven/index/DefaultQueryCreator.java    | 39 ++++++----------
 .../java/org/apache/maven/index/NexusIndexer.java  |  9 ++--
 .../maven/index/treeview/DefaultIndexTreeView.java | 11 ++---
 .../maven/index/DefaultIndexNexusIndexerTest.java  | 35 ++++----------
 .../maven/index/FullIndexNexusIndexerTest.java     | 20 +++-----
 .../maven/index/Nexus13NexusIndexerTest.java       |  6 ---
 .../maven/index/Nexus3881NexusIndexerTest.java     | 12 ++---
 .../org/apache/maven/index/NexusIndexerTest.java   | 28 +++++------
 .../maven/index/SearchWithAnEmptyIndexTest.java    | 53 ++++++++-------------
 .../creator/OsgiArtifactIndexCreatorTest.java      | 54 ++++++++--------------
 .../resources/testQueryCreatorNGSearch/case01.txt  |  2 +-
 .../resources/testQueryCreatorNGSearch/case05.txt  |  2 +-
 .../maven/indexer/examples/BasicUsageExample.java  | 44 +++++++++---------
 .../examples/indexing/RepositoryIndexer.java       | 21 +++++----
 14 files changed, 138 insertions(+), 198 deletions(-)

diff --git a/indexer-core/src/main/java/org/apache/maven/index/DefaultQueryCreator.java b/indexer-core/src/main/java/org/apache/maven/index/DefaultQueryCreator.java
index 63a2196..8fab44b 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/DefaultQueryCreator.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/DefaultQueryCreator.java
@@ -30,6 +30,7 @@ import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.queryparser.classic.QueryParser.Operator;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.BoostQuery;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.TermQuery;
@@ -280,19 +281,12 @@ public class DefaultQueryCreator
                 }
                 else
                 {
-                    BooleanQuery bq = new BooleanQuery();
-
                     Term t = new Term( indexerField.getKey(), query );
-
-                    bq.add( new TermQuery( t ), Occur.SHOULD );
-
-                    PrefixQuery pq = new PrefixQuery( t );
-                    pq.setBoost( 0.8f );
-
-                    bq.add( pq, Occur.SHOULD );
-
-                    return bq;
-                }
+                    return new BooleanQuery.Builder()
+                        .add( new TermQuery( t ), Occur.SHOULD )
+                        .add( new BoostQuery( new PrefixQuery( t ), 0.8f ), Occur.SHOULD )
+                        .build();
+            }
             }
             else
             {
@@ -326,13 +320,12 @@ public class DefaultQueryCreator
                 {
                     // qpQuery = "\"" + qpQuery + "\"";
 
-                    BooleanQuery q1 = new BooleanQuery();
-
-                    q1.add( qp.parse( qpQuery ), Occur.SHOULD );
+                    BooleanQuery.Builder q1b = new BooleanQuery.Builder()
+                            .add( qp.parse( qpQuery ), Occur.SHOULD );
 
                     if ( qpQuery.contains( " " ) )
                     {
-                        q1.add( qp.parse( "\"" + qpQuery + "\"" ), Occur.SHOULD );
+                        q1b.add( qp.parse( "\"" + qpQuery + "\"" ), Occur.SHOULD );
                     }
 
                     Query q2 = null;
@@ -353,17 +346,15 @@ public class DefaultQueryCreator
 
                     if ( q2 == null )
                     {
-                        return q1;
+                        return q1b.build();
                     }
                     else
                     {
-                        BooleanQuery bq = new BooleanQuery();
-
-                        // trick with order
-                        bq.add( q2, Occur.SHOULD );
-                        bq.add( q1, Occur.SHOULD );
-
-                        return bq;
+                        return new BooleanQuery.Builder()
+                            // trick with order
+                            .add( q2, Occur.SHOULD )
+                            .add( q1b.build(), Occur.SHOULD )
+                            .build();
                     }
                 }
                 catch ( ParseException e )
diff --git a/indexer-core/src/main/java/org/apache/maven/index/NexusIndexer.java b/indexer-core/src/main/java/org/apache/maven/index/NexusIndexer.java
index ab0678f..d3996d5 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/NexusIndexer.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/NexusIndexer.java
@@ -63,10 +63,11 @@ import org.apache.maven.index.expr.SearchExpression;
  * 
  * <pre>
  *   // run search query
- *   BooleanQuery q = new BooleanQuery();
- *   q.add(indexer.constructQuery(ArtifactInfo.GROUP_ID, term), Occur.SHOULD);
- *   q.add(indexer.constructQuery(ArtifactInfo.ARTIFACT_ID, term), Occur.SHOULD);
- *   q.add(new PrefixQuery(new Term(ArtifactInfo.SHA1, term)), Occur.SHOULD);
+ *   BooleanQuery q = new BooleanQuery.Builder()
+ *    .add(indexer.constructQuery(ArtifactInfo.GROUP_ID, term), Occur.SHOULD)
+ *    .add(indexer.constructQuery(ArtifactInfo.ARTIFACT_ID, term), Occur.SHOULD)
+ *    .add(new PrefixQuery(new Term(ArtifactInfo.SHA1, term)), Occur.SHOULD)
+ *    .build();
  *   
  *   FlatSearchRequest request = new FlatSearchRequest(q);
  *   FlatSearchResponse response = indexer.searchFlat(request);
diff --git a/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java b/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java
index 61f450c..d1a4490 100644
--- a/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java
+++ b/indexer-core/src/main/java/org/apache/maven/index/treeview/DefaultIndexTreeView.java
@@ -518,21 +518,20 @@ public class DefaultIndexTreeView
             versionQ = getIndexer().constructQuery( MAVEN.VERSION, new SourcedSearchExpression( v ) );
         }
 
-        BooleanQuery q = new BooleanQuery();
-
-        q.add( new BooleanClause( groupIdQ, BooleanClause.Occur.MUST ) );
+        BooleanQuery.Builder qb = new BooleanQuery.Builder()
+            .add( new BooleanClause( groupIdQ, BooleanClause.Occur.MUST ) );
 
         if ( artifactIdQ != null )
         {
-            q.add( new BooleanClause( artifactIdQ, BooleanClause.Occur.MUST ) );
+            qb.add( new BooleanClause( artifactIdQ, BooleanClause.Occur.MUST ) );
         }
 
         if ( versionQ != null )
         {
-            q.add( new BooleanClause( versionQ, BooleanClause.Occur.MUST ) );
+            qb.add( new BooleanClause( versionQ, BooleanClause.Occur.MUST ) );
         }
 
-        IteratorSearchRequest searchRequest = new IteratorSearchRequest( q, request.getArtifactInfoFilter() );
+        IteratorSearchRequest searchRequest = new IteratorSearchRequest( qb.build(), request.getArtifactInfoFilter() );
 
         searchRequest.getContexts().add( request.getIndexingContext() );
 
diff --git a/indexer-core/src/test/java/org/apache/maven/index/DefaultIndexNexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/DefaultIndexNexusIndexerTest.java
index e049496..35836af 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/DefaultIndexNexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/DefaultIndexNexusIndexerTest.java
@@ -29,11 +29,11 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.lucene.index.Term;
-import org.apache.lucene.search.FilteredQuery;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
@@ -64,18 +64,10 @@ public class DefaultIndexNexusIndexerTest
     public void testPlugin()
         throws Exception
     {
-        // String term = "plugin";
-        // String term = "maven-core-it-plugin";
-        String term = "org.apache.maven.plugins";
-
-        // Query bq = new TermQuery(new Term(ArtifactInfo.GROUP_ID, "org.apache.maven.plugins"));
-        // Query bq = new TermQuery(new Term(ArtifactInfo.ARTIFACT_ID, term));
-        Query bq = new PrefixQuery( new Term( ArtifactInfo.GROUP_ID, term ) );
-        // BooleanQuery bq = new BooleanQuery();
-        // bq.add(new PrefixQuery(new Term(ArtifactInfo.GROUP_ID, term + "*")), Occur.SHOULD);
-        // bq.add(new PrefixQuery(new Term(ArtifactInfo.ARTIFACT_ID, term + "*")), Occur.SHOULD);
-        TermQuery tq = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-plugin" ) );
-        Query query = new FilteredQuery( tq, new QueryWrapperFilter( bq ) );
+        Query query = new BooleanQuery.Builder()
+            .add( new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-plugin" ) ), Occur.MUST )
+            .add( new PrefixQuery( new Term( ArtifactInfo.GROUP_ID, "org.apache.maven.plugins" ) ), Occur.FILTER )
+            .build();
 
         FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( query ) );
 
@@ -119,12 +111,6 @@ public class DefaultIndexNexusIndexerTest
     public void testSearchArchetypes()
         throws Exception
     {
-        // TermQuery tq = new TermQuery(new Term(ArtifactInfo.PACKAGING, "maven-archetype"));
-        // BooleanQuery bq = new BooleanQuery();
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.GROUP_ID, term + "*")), Occur.SHOULD);
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.ARTIFACT_ID, term + "*")), Occur.SHOULD);
-        // FilteredQuery query = new FilteredQuery(tq, new QueryWrapperFilter(bq));
-
         Query q = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) );
         FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( q ) );
         Collection<ArtifactInfo> r = response.getResults();
@@ -240,11 +226,10 @@ public class DefaultIndexNexusIndexerTest
     public void testArchetype()
         throws Exception
     {
-        String term = "proptest";
-
-        Query bq = new PrefixQuery( new Term( ArtifactInfo.GROUP_ID, term ) );
-        TermQuery tq = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) );
-        Query query = new FilteredQuery( tq, new QueryWrapperFilter( bq ) );
+        Query query = new BooleanQuery.Builder()
+            .add( new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) ), Occur.MUST )
+            .add( new PrefixQuery( new Term( ArtifactInfo.GROUP_ID, "proptest" ) ), Occur.FILTER )
+            .build();
 
         FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( query ) );
 
diff --git a/indexer-core/src/test/java/org/apache/maven/index/FullIndexNexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/FullIndexNexusIndexerTest.java
index 0c5e140..db69e47 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/FullIndexNexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/FullIndexNexusIndexerTest.java
@@ -19,8 +19,6 @@ package org.apache.maven.index;
  * under the License.
  */
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.nio.file.Files;
 import java.util.ArrayList;
@@ -33,16 +31,14 @@ import java.util.Set;
 
 import org.apache.lucene.index.Term;
 import org.apache.lucene.queryparser.classic.ParseException;
-import org.apache.lucene.search.FilteredQuery;
+import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PrefixQuery;
 import org.apache.lucene.search.Query;
-import org.apache.lucene.search.QueryWrapperFilter;
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
 import org.apache.maven.index.context.IndexingContext;
-import org.apache.maven.index.packer.DefaultIndexPacker;
 import org.apache.maven.index.packer.IndexPacker;
 import org.apache.maven.index.packer.IndexPackingRequest;
 import org.apache.maven.index.search.grouping.GAGrouping;
@@ -51,6 +47,7 @@ import org.apache.maven.index.updater.DefaultIndexUpdater;
 import org.apache.maven.index.updater.IndexUpdateRequest;
 import org.apache.maven.index.updater.IndexUpdater;
 
+import static org.apache.lucene.search.BooleanClause.*;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
@@ -294,12 +291,6 @@ public class FullIndexNexusIndexerTest
     public void testSearchArchetypes()
         throws Exception
     {
-        // TermQuery tq = new TermQuery(new Term(ArtifactInfo.PACKAGING, "maven-archetype"));
-        // BooleanQuery bq = new BooleanQuery();
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.GROUP_ID, term + "*")), Occur.SHOULD);
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.ARTIFACT_ID, term + "*")), Occur.SHOULD);
-        // FilteredQuery query = new FilteredQuery(tq, new QueryWrapperFilter(bq));
-
         Query q = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) );
         FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( q ) );
         Collection<ArtifactInfo> r = response.getResults();
@@ -418,9 +409,12 @@ public class FullIndexNexusIndexerTest
 
         Query bq = new PrefixQuery( new Term( ArtifactInfo.GROUP_ID, term ) );
         TermQuery tq = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) );
-        Query query = new FilteredQuery( tq, new QueryWrapperFilter( bq ) );
 
-        FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( query ) );
+        FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest(
+                new BooleanQuery.Builder()
+                .add(tq, Occur.MUST)
+                .add(bq, Occur.FILTER)
+                .build() ) );
 
         Collection<ArtifactInfo> r = response.getResults();
 
diff --git a/indexer-core/src/test/java/org/apache/maven/index/Nexus13NexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/Nexus13NexusIndexerTest.java
index f520a9e..e848270 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/Nexus13NexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/Nexus13NexusIndexerTest.java
@@ -91,12 +91,6 @@ public class Nexus13NexusIndexerTest
     public void testSearchArchetypes()
         throws Exception
     {
-        // TermQuery tq = new TermQuery(new Term(ArtifactInfo.PACKAGING, "maven-archetype"));
-        // BooleanQuery bq = new BooleanQuery();
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.GROUP_ID, term + "*")), Occur.SHOULD);
-        // bq.add(new WildcardQuery(new Term(ArtifactInfo.ARTIFACT_ID, term + "*")), Occur.SHOULD);
-        // FilteredQuery query = new FilteredQuery(tq, new QueryWrapperFilter(bq));
-
         Query q = new TermQuery( new Term( ArtifactInfo.PACKAGING, "maven-archetype" ) );
 
         FlatSearchResponse response = nexusIndexer.searchFlat( new FlatSearchRequest( q ) );
diff --git a/indexer-core/src/test/java/org/apache/maven/index/Nexus3881NexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/Nexus3881NexusIndexerTest.java
index 09988a0..99e00d1 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/Nexus3881NexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/Nexus3881NexusIndexerTest.java
@@ -25,7 +25,6 @@ import junit.framework.Assert;
 
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
 
 public class Nexus3881NexusIndexerTest
     extends AbstractNexusIndexerTest
@@ -44,14 +43,11 @@ public class Nexus3881NexusIndexerTest
     public void testRelevances()
         throws Exception
     {
-        Query q1 = nexusIndexer.constructQuery( MAVEN.GROUP_ID, "solution", SearchType.SCORED );
-        Query q2 = nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "solution", SearchType.SCORED );
+        IteratorSearchRequest request = new IteratorSearchRequest( new BooleanQuery.Builder()
+            .add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, "solution", SearchType.SCORED ), Occur.SHOULD )
+            .add( nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, "solution", SearchType.SCORED ), Occur.SHOULD )
+            .build() );
 
-        BooleanQuery bq = new BooleanQuery();
-        bq.add( q1, Occur.SHOULD );
-        bq.add( q2, Occur.SHOULD );
-
-        IteratorSearchRequest request = new IteratorSearchRequest( bq );
         request.setLuceneExplain( true );
         
         IteratorSearchResponse response = nexusIndexer.searchIterator( request );
diff --git a/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java b/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
index 21d1f92..33a3ff1 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/NexusIndexerTest.java
@@ -49,7 +49,6 @@ import org.apache.maven.index.context.MergedIndexingContext;
 import org.apache.maven.index.context.StaticContextMemberProvider;
 import org.apache.maven.index.context.UnsupportedExistingLuceneIndexException;
 import org.apache.maven.index.creator.MinimalArtifactInfoIndexCreator;
-import org.apache.maven.index.packer.DefaultIndexPacker;
 import org.apache.maven.index.packer.IndexPacker;
 import org.apache.maven.index.packer.IndexPackingRequest;
 import org.apache.maven.index.search.grouping.GAGrouping;
@@ -119,13 +118,13 @@ public class NexusIndexerTest
         // scored search against field having untokenized indexerField only
         q = indexer.constructQuery( MAVEN.PACKAGING, "maven-archetype", SearchType.SCORED );
 
-        assertEquals( "p:maven-archetype p:maven-archetype*", q.toString() );
+        assertEquals( "p:maven-archetype p:maven-archetype*^0.8", q.toString() );
 
         // scored search against field having untokenized indexerField only
         q = indexer.constructQuery( MAVEN.ARTIFACT_ID, "commons-logging", SearchType.SCORED );
 
         assertEquals(
-            "(a:commons-logging a:commons-logging*) ((+artifactId:commons +artifactId:logging*) artifactId:\"commons logging\")",
+            "(a:commons-logging a:commons-logging*^0.8) ((+artifactId:commons +artifactId:logging*) artifactId:\"commons logging\")",
             q.toString() );
 
         // scored search against field having tokenized IndexerField only (should be impossible).
@@ -227,7 +226,6 @@ public class NexusIndexerTest
         // and comes the "trick", i will perform single _selection_!
         // I want to ensure there is an artifact present!
         // explanation: see for yourself ;)
-        BooleanQuery bq = new BooleanQuery();
 
         Query g = indexer.constructQuery( MAVEN.GROUP_ID, "commons-logging", SearchType.EXACT );
         Query a = indexer.constructQuery( MAVEN.ARTIFACT_ID, "commons-logging", SearchType.EXACT );
@@ -236,11 +234,13 @@ public class NexusIndexerTest
         Query c = indexer.constructQuery( MAVEN.CLASSIFIER, Field.NOT_PRESENT, SearchType.EXACT );
 
         // so, I am looking up GAVP (for content of those look above) that _has no_ classifier
-        bq.add( g, Occur.MUST );
-        bq.add( a, Occur.MUST );
-        bq.add( v, Occur.MUST );
-        bq.add( p, Occur.MUST );
-        bq.add( c, Occur.MUST_NOT );
+        BooleanQuery bq = new BooleanQuery.Builder()
+            .add( g, Occur.MUST )
+            .add( a, Occur.MUST )
+            .add( v, Occur.MUST )
+            .add( p, Occur.MUST )
+            .add( c, Occur.MUST_NOT )
+            .build();
 
         // invoking the old method (was present since day 1), that will return the match only and if only there is 1 hit
         Collection<ArtifactInfo> ais = indexer.identify( bq, Collections.singletonList( context ) );
@@ -443,10 +443,12 @@ public class NexusIndexerTest
         }
 
         {
-            BooleanQuery bq = new BooleanQuery( true );
-            bq.add( new WildcardQuery( new Term( ArtifactInfo.GROUP_ID, "testng*" ) ), Occur.SHOULD );
-            bq.add( new WildcardQuery( new Term( ArtifactInfo.ARTIFACT_ID, "testng*" ) ), Occur.SHOULD );
-            bq.setMinimumNumberShouldMatch( 1 );
+            BooleanQuery bq = new BooleanQuery.Builder()
+                .setDisableCoord( true )
+                .add( new WildcardQuery( new Term( ArtifactInfo.GROUP_ID, "testng*" ) ), Occur.SHOULD )
+                .add( new WildcardQuery( new Term( ArtifactInfo.ARTIFACT_ID, "testng*" ) ), Occur.SHOULD )
+                .setMinimumNumberShouldMatch( 1 )
+                .build();
 
             FlatSearchResponse response = indexer.searchFlat( new FlatSearchRequest( bq ) );
             Set<ArtifactInfo> r = response.getResults();
diff --git a/indexer-core/src/test/java/org/apache/maven/index/SearchWithAnEmptyIndexTest.java b/indexer-core/src/test/java/org/apache/maven/index/SearchWithAnEmptyIndexTest.java
index ad10a1d..7d86320 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/SearchWithAnEmptyIndexTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/SearchWithAnEmptyIndexTest.java
@@ -19,7 +19,6 @@ package org.apache.maven.index;
  * under the License.
  */
 
-import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.maven.index.context.IndexCreator;
@@ -34,6 +33,8 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import static org.apache.lucene.search.BooleanClause.*;
+
 /**
  * @author Olivier Lamy
  */
@@ -89,11 +90,9 @@ public class SearchWithAnEmptyIndexTest
 
         try
         {
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME,
-                                                new StringSearchExpression( "org.apache.karaf.features.command" ) ),
-                   BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME, new StringSearchExpression( "org.apache.karaf.features.command" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             assertEquals( 2, nexusIndexer.getIndexingContexts().values().size() );
@@ -104,11 +103,9 @@ public class SearchWithAnEmptyIndexTest
 
             assertEquals( 1, response.getResults().size() );
 
-            q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME,
-                                                new StringSearchExpression( "org.apache.karaf.features.core" ) ),
-                   BooleanClause.Occur.MUST );
+            q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME, new StringSearchExpression( "org.apache.karaf.features.core" ) ), Occur.MUST )
+                .build();
 
             request = new FlatSearchRequest( q );
             request.setContexts( new ArrayList( nexusIndexer.getIndexingContexts().values() ) );
@@ -119,18 +116,13 @@ public class SearchWithAnEmptyIndexTest
 
             String term = "org.apache.karaf.features";
 
-            q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( term ) ),
-                   BooleanClause.Occur.SHOULD );
-            q.add( nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, new StringSearchExpression( term ) ),
-                   BooleanClause.Occur.SHOULD );
-            q.add( nexusIndexer.constructQuery( MAVEN.VERSION, new StringSearchExpression( term ) ),
-                   BooleanClause.Occur.SHOULD );
-            q.add( nexusIndexer.constructQuery( MAVEN.PACKAGING, new StringSearchExpression( term ) ),
-                   BooleanClause.Occur.SHOULD );
-            q.add( nexusIndexer.constructQuery( MAVEN.CLASSNAMES, new StringSearchExpression( term ) ),
-                   BooleanClause.Occur.SHOULD );
+            q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( term ) ), Occur.SHOULD )
+                .add( nexusIndexer.constructQuery( MAVEN.ARTIFACT_ID, new StringSearchExpression( term ) ), Occur.SHOULD )
+                .add( nexusIndexer.constructQuery( MAVEN.VERSION, new StringSearchExpression( term ) ), Occur.SHOULD )
+                .add( nexusIndexer.constructQuery( MAVEN.PACKAGING, new StringSearchExpression( term ) ), Occur.SHOULD )
+                .add( nexusIndexer.constructQuery( MAVEN.CLASSNAMES, new StringSearchExpression( term ) ), Occur.SHOULD )
+                .build();
 
             request = new FlatSearchRequest( q );
             request.setContexts( new ArrayList( nexusIndexer.getIndexingContexts().values() ) );
@@ -173,16 +165,11 @@ public class SearchWithAnEmptyIndexTest
 
         try
         {
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( "commons-cli" ) ),
-                   BooleanClause.Occur.MUST );
-
-            q.add( nexusIndexer.constructQuery( MAVEN.PACKAGING, new StringSearchExpression( "jar" ) ),
-                   BooleanClause.Occur.MUST );
-
-            q.add( nexusIndexer.constructQuery( MAVEN.CLASSIFIER, new StringSearchExpression( "sources" ) ),
-                   BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( MAVEN.GROUP_ID, new StringSearchExpression( "commons-cli" ) ), Occur.MUST )
+                .add( nexusIndexer.constructQuery( MAVEN.PACKAGING, new StringSearchExpression( "jar" ) ), Occur.MUST )
+                .add( nexusIndexer.constructQuery( MAVEN.CLASSIFIER, new StringSearchExpression( "sources" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             assertEquals( 2, nexusIndexer.getIndexingContexts().values().size() );
diff --git a/indexer-core/src/test/java/org/apache/maven/index/creator/OsgiArtifactIndexCreatorTest.java b/indexer-core/src/test/java/org/apache/maven/index/creator/OsgiArtifactIndexCreatorTest.java
index 5117544..f90224e 100644
--- a/indexer-core/src/test/java/org/apache/maven/index/creator/OsgiArtifactIndexCreatorTest.java
+++ b/indexer-core/src/test/java/org/apache/maven/index/creator/OsgiArtifactIndexCreatorTest.java
@@ -22,7 +22,7 @@ package org.apache.maven.index.creator;
 import java.io.File;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.maven.index.ArtifactContext;
 import org.apache.maven.index.ArtifactInfo;
@@ -193,11 +193,9 @@ public class OsgiArtifactIndexCreatorTest
         {
             indexOSGIRepo();
 
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME,
-                                                new StringSearchExpression( "org.apache.karaf.features.command" ) ),
-                   BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME, new StringSearchExpression( "org.apache.karaf.features.command" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             FlatSearchResponse response = nexusIndexer.searchFlat( request );
@@ -205,11 +203,9 @@ public class OsgiArtifactIndexCreatorTest
             // here only one results !
             assertEquals( 1, response.getResults().size() );
 
-            q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME,
-                                                new StringSearchExpression( "org.apache.karaf.features.core" ) ),
-                   BooleanClause.Occur.MUST );
+            q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME, new StringSearchExpression( "org.apache.karaf.features.core" ) ), Occur.MUST )
+                .build();
 
             request = new FlatSearchRequest( q );
             response = nexusIndexer.searchFlat( request );
@@ -232,14 +228,10 @@ public class OsgiArtifactIndexCreatorTest
         try
         {
 
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME,
-                                                new StringSearchExpression( "org.apache.karaf.features.core" ) ),
-                   BooleanClause.Occur.MUST );
-
-            q.add( nexusIndexer.constructQuery( OSGI.VERSION, new StringSearchExpression( "2.2.1" ) ),
-                   BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.SYMBOLIC_NAME, new StringSearchExpression( "org.apache.karaf.features.core" ) ), Occur.MUST )
+                .add( nexusIndexer.constructQuery( OSGI.VERSION, new StringSearchExpression( "2.2.1" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             FlatSearchResponse response = nexusIndexer.searchFlat( request );
@@ -261,11 +253,9 @@ public class OsgiArtifactIndexCreatorTest
 
         try {
 
-            BooleanQuery q = new BooleanQuery();
-
-
-            q.add(nexusIndexer.constructQuery(OSGI.SHA256, new StringSearchExpression(CORE_4_1_0_SHA256)),
-                    BooleanClause.Occur.MUST);
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add(nexusIndexer.constructQuery( OSGI.SHA256, new StringSearchExpression(CORE_4_1_0_SHA256)), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest(q);
             FlatSearchResponse response = nexusIndexer.searchFlat(request);
@@ -290,11 +280,9 @@ public class OsgiArtifactIndexCreatorTest
 
         try
         {
-
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.EXPORT_PACKAGE, new StringSearchExpression(
-                "org.apache.karaf.features.command.completers" ) ), BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.EXPORT_PACKAGE, new StringSearchExpression( "org.apache.karaf.features.command.completers" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             FlatSearchResponse response = nexusIndexer.searchFlat( request );
@@ -336,11 +324,9 @@ public class OsgiArtifactIndexCreatorTest
 
         try
         {
-
-            BooleanQuery q = new BooleanQuery();
-
-            q.add( nexusIndexer.constructQuery( OSGI.EXPORT_SERVICE, new StringSearchExpression(
-                "org.apache.felix.bundlerepository.RepositoryAdmin" ) ), BooleanClause.Occur.MUST );
+            BooleanQuery q = new BooleanQuery.Builder()
+                .add( nexusIndexer.constructQuery( OSGI.EXPORT_SERVICE, new StringSearchExpression( "org.apache.felix.bundlerepository.RepositoryAdmin" ) ), Occur.MUST )
+                .build();
 
             FlatSearchRequest request = new FlatSearchRequest( q );
             FlatSearchResponse response = nexusIndexer.searchFlat( request );
diff --git a/indexer-core/src/test/resources/testQueryCreatorNGSearch/case01.txt b/indexer-core/src/test/resources/testQueryCreatorNGSearch/case01.txt
index ece9199..17691d9 100644
--- a/indexer-core/src/test/resources/testQueryCreatorNGSearch/case01.txt
+++ b/indexer-core/src/test/resources/testQueryCreatorNGSearch/case01.txt
@@ -1,4 +1,4 @@
-### Searched for field urn:maven#groupId (with 2 registered index fields) using query "commons-logg" (QC create LQL "(g:commons-logg g:commons-logg*) ((+groupId:commons +groupId:logg*) groupId:"commons logg")")
+### Searched for field urn:maven#groupId (with 2 registered index fields) using query "commons-logg" (QC create LQL "(g:commons-logg g:commons-logg*^0.8) ((+groupId:commons +groupId:logg*) groupId:"commons logg")")
 test :: commons-logging:commons-logging:1.1:null:jar
 test :: commons-logging:commons-logging:1.1:sources:jar
 test :: commons-logging:commons-logging:1.0.4:null:jar
diff --git a/indexer-core/src/test/resources/testQueryCreatorNGSearch/case05.txt b/indexer-core/src/test/resources/testQueryCreatorNGSearch/case05.txt
index 511516e..bd52ac6 100644
--- a/indexer-core/src/test/resources/testQueryCreatorNGSearch/case05.txt
+++ b/indexer-core/src/test/resources/testQueryCreatorNGSearch/case05.txt
@@ -1,4 +1,4 @@
-### Searched for field urn:maven#version (with 2 registered index fields) using query "1.0" (QC create LQL "(v:1.0 v:1.0*) ((+version:1 +version:0*) version:"1 0")")
+### Searched for field urn:maven#version (with 2 registered index fields) using query "1.0" (QC create LQL "(v:1.0 v:1.0*^0.8) ((+version:1 +version:0*) version:"1 0")")
 test :: proptest:proptest-archetype:1.0:null:maven-archetype
 test :: org.apache.maven.plugins:maven-core-it-plugin:1.0:null:maven-plugin
 test :: org.apache.maven.plugins:maven-core-it-plugin:1.0:sources:jar
diff --git a/indexer-examples/indexer-examples-basic/src/main/java/org/apache/maven/indexer/examples/BasicUsageExample.java b/indexer-examples/indexer-examples-basic/src/main/java/org/apache/maven/indexer/examples/BasicUsageExample.java
index 6bdf666..808f3d5 100644
--- a/indexer-examples/indexer-examples-basic/src/main/java/org/apache/maven/indexer/examples/BasicUsageExample.java
+++ b/indexer-examples/indexer-examples-basic/src/main/java/org/apache/maven/indexer/examples/BasicUsageExample.java
@@ -233,16 +233,16 @@ public class BasicUsageExample
             indexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.sonatype.nexus" ) );
         final Query artifactIdQ =
             indexer.constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( "nexus-api" ) );
-        final BooleanQuery query = new BooleanQuery();
-        query.add( groupIdQ, Occur.MUST );
-        query.add( artifactIdQ, Occur.MUST );
 
-        // we want "jar" artifacts only
-        query.add( indexer.constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "jar" ) ), Occur.MUST );
-        // we want main artifacts only (no classifier)
-        // Note: this below is unfinished API, needs fixing
-        query.add( indexer.constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( Field.NOT_PRESENT ) ),
-                   Occur.MUST_NOT );
+        final BooleanQuery query = new BooleanQuery.Builder()
+            .add( groupIdQ, Occur.MUST )
+            .add( artifactIdQ, Occur.MUST )
+            // we want "jar" artifacts only
+            .add( indexer.constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "jar" ) ), Occur.MUST )
+            // we want main artifacts only (no classifier)
+            // Note: this below is unfinished API, needs fixing
+            .add( indexer.constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( Field.NOT_PRESENT ) ), Occur.MUST_NOT )
+            .build();
 
         // construct the filter to express "V greater than"
         final ArtifactInfoFilter versionFilter = new ArtifactInfoFilter()
@@ -280,18 +280,19 @@ public class BasicUsageExample
             indexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.apache.maven.indexer" ) );
         Query aidQ = indexer.constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( "indexer-artifact" ) );
 
-        BooleanQuery bq = new BooleanQuery();
-        bq.add( gidQ, Occur.MUST );
-        bq.add( aidQ, Occur.MUST );
+        BooleanQuery bq = new BooleanQuery.Builder()
+                .add( gidQ, Occur.MUST )
+                .add( aidQ, Occur.MUST )
+                .build();
 
         searchAndDump( indexer, "all artifacts under GA org.apache.maven.indexer:indexer-artifact", bq );
 
         // Searching for some main artifact
-        bq = new BooleanQuery();
-        bq.add( gidQ, Occur.MUST );
-        bq.add( aidQ, Occur.MUST );
-        // bq.add( nexusIndexer.constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( "*" ) ), Occur.MUST_NOT
-        // );
+        bq = new BooleanQuery.Builder()
+                .add( gidQ, Occur.MUST )
+                .add( aidQ, Occur.MUST )
+//                .add( indexer.constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( "*" ) ), Occur.MUST_NOT )
+                .build();
 
         searchAndDump( indexer, "main artifacts under GA org.apache.maven.indexer:indexer-artifact", bq );
 
@@ -311,10 +312,11 @@ public class BasicUsageExample
                                                new UserInputSearchExpression( "DefaultNexusIndexer" ) ) );
 
         // doing search for all "canonical" maven plugins latest versions
-        bq = new BooleanQuery();
-        bq.add( indexer.constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "maven-plugin" ) ), Occur.MUST );
-        bq.add( indexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.apache.maven.plugins" ) ),
-                Occur.MUST );
+        bq = new BooleanQuery.Builder()
+            .add( indexer.constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "maven-plugin" ) ), Occur.MUST )
+            .add( indexer.constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( "org.apache.maven.plugins" ) ), Occur.MUST )
+            .build();
+
         searchGroupedAndDump( indexer, "all \"canonical\" maven plugins", bq, new GAGrouping() );
 
         // doing search for all archetypes latest versions
diff --git a/indexer-examples/indexer-examples-spring/src/main/java/org/apache/maven/indexer/examples/indexing/RepositoryIndexer.java b/indexer-examples/indexer-examples-spring/src/main/java/org/apache/maven/indexer/examples/indexing/RepositoryIndexer.java
index a9dbf1b..c4969dd 100644
--- a/indexer-examples/indexer-examples-spring/src/main/java/org/apache/maven/indexer/examples/indexing/RepositoryIndexer.java
+++ b/indexer-examples/indexer-examples-spring/src/main/java/org/apache/maven/indexer/examples/indexing/RepositoryIndexer.java
@@ -116,40 +116,42 @@ public class RepositoryIndexer
                                      final String packaging, final String classifier )
         throws IOException
     {
-        final BooleanQuery query = new BooleanQuery();
+        final BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
 
         if ( groupId != null )
         {
-            query.add( getIndexer().constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( groupId ) ), MUST );
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.GROUP_ID, new SourcedSearchExpression( groupId ) ), MUST );
         }
 
         if ( artifactId != null )
         {
-            query.add( getIndexer().constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( artifactId ) ),
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.ARTIFACT_ID, new SourcedSearchExpression( artifactId ) ),
                        MUST );
         }
 
         if ( version != null )
         {
-            query.add( getIndexer().constructQuery( MAVEN.VERSION, new SourcedSearchExpression( version ) ), MUST );
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.VERSION, new SourcedSearchExpression( version ) ), MUST );
         }
 
         if ( packaging != null )
         {
-            query.add( getIndexer().constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( packaging ) ), MUST );
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( packaging ) ), MUST );
         }
         else
         {
             // Fallback to jar
-            query.add( getIndexer().constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "jar" ) ), MUST );
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.PACKAGING, new SourcedSearchExpression( "jar" ) ), MUST );
         }
 
         if ( classifier != null )
         {
-            query.add( getIndexer().constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( classifier ) ),
+            queryBuilder.add( getIndexer().constructQuery( MAVEN.CLASSIFIER, new SourcedSearchExpression( classifier ) ),
                        MUST );
         }
 
+        Query query = queryBuilder.build();
+
         LOGGER.debug( "Executing search query: {}; ctx id: {}; idx dir: {}",
                       new String[]{ query.toString(), indexingContext.getId(),
                           indexingContext.getIndexDirectory().toString() } );
@@ -198,8 +200,9 @@ public class RepositoryIndexer
     public Set<ArtifactInfo> searchBySHA1( final String checksum )
         throws IOException
     {
-        final BooleanQuery query = new BooleanQuery();
-        query.add( getIndexer().constructQuery( MAVEN.SHA1, new SourcedSearchExpression( checksum ) ), MUST );
+        final BooleanQuery query = new BooleanQuery.Builder()
+                .add( getIndexer().constructQuery( MAVEN.SHA1, new SourcedSearchExpression( checksum ) ), MUST )
+                .build();
 
         LOGGER.debug( "Executing search query: {}; ctx id: {}; idx dir: {}",
                       new String[]{ query.toString(), indexingContext.getId(),