[英]Lucene search on multiple fields but match on any
我目前正在嘗試創建一個查詢,該查詢可以在4個字段上進行搜索,但在與任何字段匹配的地方返回文檔。
有人可以告訴我如何進行設置。 我已經嘗試過BooleanQuery和MultiFieldQueryParser,但沒有獲得任何成功。
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("field1", text1));
Query query2 = new TermQuery(new Term("field2", text2));
Query query3 = new TermQuery(new Term("field3", text3));
Query query4 = new TermQuery(new Term("field4", text4));
booleanQuery.add(query1, Occur.SHOULD);
booleanQuery.add(query2, Occur.SHOULD);
booleanQuery.add(query3, Occur.SHOULD);
booleanQuery.add(query4, Occur.SHOULD);
MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44,
new String[] {"field1", "field2", "field3", "field4"}, analyzer);
multiQueryParser.setDefaultOperator(Operator.OR);
使用multiQueryParser將運算符設置為AND時,我得到了結果,但是使用OR卻沒有任何結果。 我認為只有在兩個字段匹配時才返回結果。
有人可以建議出什么問題嗎?
謝謝
另外,我正在尋找部分比賽或全部比賽。
完整代碼:
公共課程演示{
IndexWriter indexWriter = null;
public boolean openIndex() {
try {
Directory dir = FSDirectory.open(new File(indexerPath));
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, analyzer);
indexWriter = new IndexWriter(dir, iwc);
isIndexOpen = true;
return true;
} catch (Exception e) {
return false;
}
}
public void finish() {
try {
indexWriter.close();
isIndexOpen = false;
} catch (IOException e) {
}
}
@Override
public void addDoc(MyObject obj) {
Document doc = new Document();
doc.add(new TextField("field1", obj.getField1(), Field.Store.YES));
doc.add(new TextField("field2", obj.getField2(),, Field.Store.YES));
doc.add(new TextField("field3", obj.getField3(),, Field.Store.YES));
doc.add(new TextField("field4", obj.getField4(),, Field.Store.YES));
try {
indexWriter.addDocument(doc);
} catch (IOException e) {
}
}
@Override
public void getResults(String text) throws ParseException, IOException {
Directory dir = FSDirectory.open(new File(indexerPath));
IndexReader reader = DirectoryReader.open(dir);
StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44,
new String[] {"field1", "field2", "field3", "field4"}, analyzer);
multiQueryParser.setDefaultOperator(Operator.OR);
Query query = multiQueryParser.parse(text);
searcher.search(query, collector);
hits = collector.topDocs().scoreDocs;
for (int i = 0; i < hits.length; ++i) {
int docId = hits[i].doc;
Document d = searcher.doc(docId);
Log.info("\f1: "+d.get("field1") + " f2: " + d.get("field2") +
" f3: "+d.get("field3") + " f4: "+ d.get("field3"));
}
return results;
}
}
獨立的示例表示編譯並依靠外部資源來運行/演示問題的代碼。 您的代碼沒有。
這是代碼的修改后的版本,可以正常工作並演示部分匹配。
public class Demo {
static Directory dir;
IndexWriter indexWriter;
public boolean openIndex() {
try {
dir = new RAMDirectory();
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_44, analyzer);
indexWriter = new IndexWriter(dir, iwc);
return true;
} catch (Exception e) {
return false;
}
}
public void finish() {
try {
indexWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void addDoc() {
Document doc = new Document();
doc.add(new TextField("field1", "val1", Field.Store.YES));
doc.add(new TextField("field2", "val2", Field.Store.YES));
doc.add(new TextField("field3", "val3", Field.Store.YES));
doc.add(new TextField("field4", "val4", Field.Store.YES));
try {
indexWriter.addDocument(doc);
indexWriter.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printResults(Query query) throws IOException {
IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);
TopDocs result = searcher.search(query, 5);
System.out.println("# of results:" + result.totalHits);
for (ScoreDoc doc : result.scoreDocs) {
System.out.println(doc);
}
reader.close();
}
public static void main(String[] args) throws IOException, ParseException {
Demo demo = new Demo();
demo.openIndex();
demo.addDoc();
demo.finish();
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("field1", "val1"));
Query query2 = new TermQuery(new Term("field2", "val2"));
Query query3 = new TermQuery(new Term("field3", "val3"));
Query query4 = new TermQuery(new Term("field4", "val4"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
booleanQuery.add(query3, BooleanClause.Occur.SHOULD);
booleanQuery.add(query4, BooleanClause.Occur.SHOULD);
printResults(booleanQuery);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
MultiFieldQueryParser multiQueryParser = new MultiFieldQueryParser(Version.LUCENE_44,
new String[] {"field1", "field2", "field3", "field4"}, analyzer);
multiQueryParser.setDefaultOperator(QueryParser.Operator.OR);
Query mfQuery = multiQueryParser.parse("field1:val1 field2:val2 field3:val3 field4:val4");
printResults(mfQuery);
Query mfQuery2 = multiQueryParser.parse("field1:val* field2:x field3:y field4:z");
printResults(mfQuery2);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.