2017-01-03 141 views
0

我觀察到一個奇怪的行爲,但我沒有看到我做錯了什麼。Java Lucene - BooleanQuery和QueryParser的不同結果查詢相同的Lucene查詢語言

我通過多種創建BooleanQueries以下查詢:

+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:* 

...這是我通過toString

更新得到:這樣,我創建的BooleanQuery的一部分,它負責創建這個片段+Request.zipCode:[* TO *])

Query fieldOccursQuery = new TermQuery(new Term(queryFieldName, "[* TO *]")); 

我創建了exaclty same(p呃我的理解通過)查詢的QueryParser這樣的:

String querystr = "+(-(Request.zipCode:18055 Request.zipCode:33333 Request.zipCode:99999) +Request.zipCode:[* TO *]) *:*"; 
Query query = new QueryParser(Version.LUCENE_46, "title", LuceneServiceI.analyzer).parse(querystr); 

我處理他們兩人以同樣的方式是這樣的:

IndexReader reader = DirectoryReader.open(directory); 
IndexSearcher searcher = new IndexSearcher(reader); 
int max = reader.maxDoc(); 
TopScoreDocCollector collector = TopScoreDocCollector.create(max > 0 ? max : 1, true); 
searcher.search(query, collector); 
.... 
    ScoreDoc[] hits = collector.topDocs().scoreDocs; 
    Map<Integer, Document> docMap = new TreeMap<Integer, Document>(); 
    for (int i = 0; i < hits.length; i++) { 
     docMap.put(hits[i].doc, indexSearcher.doc(hits[i].doc)); 
    } 

不同的結果

像一個指標: stored,indexed,tokenized,omitNorms,indexOptions=DOCS_ONLY<Request.zipCode:04103>

  • 通過QueryParser的查詢提供一個文檔預期

  • 通過BooleanQuery查詢不提供1個預期文檔

問題

+1

您沒有提供用於構建BooleanQuery的代碼。你需要這樣做才能讓別人找到問題。不過,我很想知道:這場比賽的目的是什麼?不要看着我喜歡它做任何有用的事情... – femtoRgon

+0

構建BooleanQuery時可能使用了不同的分析器嗎? 我建議你在調試模式下檢查解析器構造的查詢,並查看什麼是結構(通過查看生成的東西的toString()開始) –

+0

@femtoRgon: 謝謝,我添加了代碼對於布爾查詢,我想我找到了導致不同結果的查詢部分。 因爲這是遺留代碼,我只想將查詢更改爲「如果字段位於文檔本身中,則不接受帶有MUST_NOT的文檔」,所以我猜想MatchAllQuery *:*在那裏,如果MUST_NOT' - (... )'是唯一的標準。但我會檢查它是否有意義。 @Yossi Vainshtein: 謝謝,但分析儀是他們兩個相同:'StandardAnalyzer(Version.LUCENE_46)' – timguy

回答

1

我找到了解決我的問題。 而不是創建此爲BooleanQuery的:

Query fieldOccursQuery = new TermQuery(new Term(queryFieldName, "[* TO *]")); 

我用這個:

ConstantScoreQuery constantScoreQuery = new ConstantScoreQuery(new FieldValueFilter(queryFieldName)); 
    query.add(constantScoreQuery, Occur.MUST); 

現在我的查詢看起來不同,但我只得到文件與我queryFieldName領域。

問題似乎是我的第一個解決方案領先的通配符: Find all Lucene documents having a certain field