lucene标题/内容搜索

时间:2017-12-05 20:05:08

标签: java lucene

我正在存储我的lucene文档:

Document doc = new Document();
doc.add(new TextField("contents", "Homer January, Lenny February"));
doc.add(new TextField("title", "2017 on call schedule.xls", Field.Store.YES));

Document doc = new Document();
doc.add(new TextField("contents", "Carl January, Frank February"));
doc.add(new TextField("title", "2018 on call schedule.xls", Field.Store.YES));

如果我搜索确切的标题或类似的

,我可以获得一个打击
2017

但是如果我尝试

这样的话就没有命中
call
on call
xls

我尝试过简单的事情,比如

 Query query1 = new QueryParser("title", analyzer).parse("on call");

和更复杂的想法,如

Builder bb = new BooleanQuery.Builder();
for(String chunk : "on call".split(" ")){
    bb.add(new TermQuery(new Term("title", chunk)), BooleanClause.Occur.SHOULD);
}
BooleanQuery booleanQuery = bb.build();

也许我存储的文档错了?

我在搜索&上使用StandardAnalyzer插入。

好像我在这里遗漏了一些非常基本的东西..任何人都有任何提示吗?

1 个答案:

答案 0 :(得分:0)

我认为,在运行搜索之前可视化您的术语总是一个好主意。以下是Luke工具的图片。

enter image description here

这仅表示没有scheduleschedule.xls的字词。

我正在使用Lucene 6.6.6并且必须修改您的代码,

Document doc = new Document();

        doc.add(new TextField("contents", "Homer January, Lenny February",Store.YES));
        doc.add(new TextField("title", "2017 on call schedule.xls", Store.YES));

        iwriter.addDocument(doc);

        doc = new Document();
        doc.add(new TextField("contents", "Carl January, Frank February",Store.YES));
        doc.add(new TextField("title", "2018 on call schedule.xls", Store.YES));

        iwriter.addDocument(doc);

        iwriter.commit(); 

现在搜索

您的查询解析器基本上是在生成一个查询 - title:schedule,这意味着在字段title上进行精确搜索(没有外卡),并且由于没有这样的术语,您会发现零点击。

将您的查询修改为 - Query query1 = new QueryParser("title", analyzer).parse("schedule*");会获得两次点击。

所以作为一种最佳实践,在搜索之前,总是试着看看&可视化您的索引数据。