在lucene中,如何查找仅包含来自搜索查询的单词的文档

时间:2019-08-29 11:25:55

标签: lucene

索引文档为:

1)经验 2)有经验 3)有经验 4)精通 5)知识 6)经验 7)知识渊博 8)知识 9)负责

如果我的搜索查询是“有经验的候选人”,则仅应检索前3个文档。那是仅包含来自搜索查询的单词的文档。例如,考虑到第4个文档,搜索查询中不存在“熟练程度”,则不应对其进行检索。

我尝试了带有Should子句的BooleanQuery。但是它也返回了部分匹配文件(4-6)。

String[] searchWords = searchQuery.split(" ");
for(String searchWord: searchWords) {
 TermQuery tq = new TermQuery(new Term("fieldName",searchWord));
 bq.add(new BooleanClause(tq, BooleanClause.Occur.SHOULD));
}
search(bq);

我只需要文件1-3。

1 个答案:

答案 0 :(得分:0)

1)用所有可能的单词创建词汇表 2)为查询中的所有单词添加must_not。

ArrayList<String> searchWords = Arrays.asList(searchQuery.split(" "));
for(String searchWord: searchWords) {
 TermQuery tq = new TermQuery(new Term("fieldName",searchWord));
 bq.add(new BooleanClause(tq, BooleanClause.Occur.SHOULD));
}
for(String word: vocabulary){
  if(!searchWords.contains(word)) {
      TermQuery tq = new TermQuery(new Term("fieldName",word));
      bq.add(new BooleanClause(tq, BooleanClause.Occur.MUST_NOT));
  }
}
search(bq);

3)如果遍历词汇表需要时间,请使用Java 8流功能并尝试对其进行优化。