2016-09-20 13 views
1

私はこの問題についてお詫びしますが、私はちょっと困惑しています。で開始するluceneのブール論理の正しい使い方

は、私は、アドレスオブジェクトのセットを持っている、と私は(擬似コードで)基本的に私は戻って持って帰りたいと思うこの

SELECT 
WHERE 
    Fuzzy(addr1, "address line 1) // = true 
AND 
    (Fuzzy(addr2, "address line 2") OR 
     Fuzzy(addrcity, "address city") OR 
     //all the other address fields 
    ) 

ようになり、クエリと関連するものを見つけようとしています少なくともアドレス行1が大まかに一致するすべてのエンティティと、アドレスの他の部分の1つにもファジー一致があります。

私はデータはこのクエリ経由であることを確認しました:正しいすべてのフィールドを持つドキュメントを返し

Query toRun = new FuzzyQuery(new Term("addr1", getLineOne())); 

を。

私のコードは以下の通りです:

public List<Address> search() { 
    List<Address> results = new ArrayList<>(); 

    BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder(); 
    queryBuilder.setMinimumNumberShouldMatch(2); 

    BooleanQuery.Builder subQueryBuilder = new BooleanQuery.Builder(); 
    subQueryBuilder.setMinimumNumberShouldMatch(1); 

    if(!getLineOne().equals("")) { 
     Query query = new FuzzyQuery(new Term("addr1", getLineOne())); 
     queryBuilder.add(query, BooleanClause.Occur.MUST); 
    } 

    if(!getLineTwo().equals("")) { 
     Query query = new FuzzyQuery(new Term("addr2", getLineTwo())); 
     subQueryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCity().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcity", getCity())); 
     subQueryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCounty().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcounty", getCounty())); 
     subQueryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCountry().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcountry", getCountry())); 
     subQueryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getPostcode().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrpostcode", getPostcode())); 
     subQueryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 

    queryBuilder.add(subQueryBuilder.build(), BooleanClause.Occur.MUST); 

    try { 
     Query toRun = queryBuilder.build(); 

     List<Document> searchResults = SearchEngine.getInstance(SEARCH_ENGINE) 
       .performSearch(toRun, 50); 

     searchResults.forEach(result -> { 
      results.add(new Address(result)); 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    return results; 
} 

オブジェクトはライン1、ライン2と国テキスト形式でこのようなクエリが供給されたときにこれは、生産:

(+ addr1:アドレス行1〜2 +((addr2:アドレス行2〜2 addrcountry:romania〜2)〜1))〜2

上記のように何も返されません。

ここで私の論理は間違っていますか?

答えて

1

最初のminimumShouldMatch呼び出しを取り除く必要があります。

setMinimumNumberShouldMatchには、一致する必要がある句の数が指定されます(SHOULD)。あなたのqueryBuilderにはSHOULDの句がないので、明らかに2つの句には一致しないため、結果は得られません。

setMinimumNumberShouldMatch行の両方を削除して、正しく動作するクエリを作成できます。代わりに、minimumShouldMatchロジックを使用して、次のように1つのBooleanQueryだけを使用して簡略化することもできます。

public List<Address> search() { 
    List<Address> results = new ArrayList<>(); 

    BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder(); 
    queryBuilder.setMinimumNumberShouldMatch(1); 

    if(!getLineOne().equals("")) { 
     //This is a MUST clause, and so doesn't factor into the minimumShouldMatch 
     Query query = new FuzzyQuery(new Term("addr1", getLineOne())); 
     queryBuilder.add(query, BooleanClause.Occur.MUST); 
    } 

    if(!getLineTwo().equals("")) { 
     Query query = new FuzzyQuery(new Term("addr2", getLineTwo())); 
     queryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCity().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcity", getCity())); 
     queryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCounty().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcounty", getCounty())); 
     queryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getCountry().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrcountry", getCountry())); 
     queryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 
    if(!getPostcode().equals("")) { 
     Query query = new FuzzyQuery(new Term("addrpostcode", getPostcode())); 
     queryBuilder.add(query, BooleanClause.Occur.SHOULD); 
    } 

    try { 
     Query toRun = queryBuilder.build(); 

     List<Document> searchResults = SearchEngine.getInstance(SEARCH_ENGINE) 
       .performSearch(toRun, 50); 

     searchResults.forEach(result -> { 
      results.add(new Address(result)); 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return results; 
} 
+0

Ahh、それはかなり意味があります。ありがとうございました。私はそれが、少なくともブーリアンのうちどれだけ多くが真実であるべきかということを意味していると思ったが、それは論理的である –

関連する問題