我的 Lucene (3.6) 文档中有“标题”和“关键字”字段。当我有一个对象title=Testfair 2012-09
和关键字时someTest
,我将文档编写为:
Document doc = new Document();
doc.add(new Field("title", title, Field.Store.NO, Field.Index.ANALYZED));
doc.add(new Field("keyword", keyword, Field.Store.NO, Field.Index.ANALYZED));
对于搜索,我使用
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_36, new String[] { "title", "keyword" }, new StandardAnalyzer(Version.LUCENE_36));
queryParser.setDefaultOperator(QueryParser.AND_OPERATOR);
queryParser.setAllowLeadingWildcard(true);
Query query = queryParser.parse(queryString);
IndexSearcher searcher = createSearcher();
TopScoreDocCollector collector = TopScoreDocCollector.create(1000, true);
searcher.search(query, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
在索引中,我可以看到(通过Luke)title
索引中的字段具有值"Testfair", "2012"
和"09"
。
现在我在搜索时想要以下行为:
Testfair 2012-09 -> match (1)
estfair -> match (2)
Testfair baz -> no match (3)
我不确定如何处理这个问题,因为我需要对 case (2) 进行隐式通配符搜索。如果我在空格处拆分搜索词*
并在每个单词之前和之后添加,我会搜索到+(title:*testmesse*) +(title:*2012-09*)
,因此2012-09
不会拆分并且找不到结果。如果我理解正确,问题出在使用中,MultiFieldQueryParser
但我不知道如何正确设置搜索,或者我是否应该以某种方式修改索引过程。
任何帮助表示赞赏!谢谢!