2

我的 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;

在索引中,我可以看到(通过Luketitle索引中的字段具有值"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但我不知道如何正确设置搜索,或者我是否应该以某种方式修改索引过程。

任何帮助表示赞赏!谢谢!

4

1 回答 1

1

与此同时,我得到了《Lucene in Action》一书并从那里得到了建议:创建一个“catch all”字段,其中包含一个字段中的所有可搜索字段并仅搜索该字段。在这个技巧的帮助下,我可以跳过,MultiFieldQueryParser因为我只有一个字段可以搜索。现在我可以简单地分析搜索词并按照我需要的方式修改它。

于 2012-09-06T09:32:44.053 回答