我观察到一种奇怪的行为,但我不知道自己做错了什么。
我通过多个 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(根据我的理解)通过 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个预期文档
问题
答案 0 :(得分: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