Lucene搜索匹配词组中的任何单词

时间:2019-09-14 13:29:29

标签: java solr lucene search-engine

我想搜索包含许多单词的字符串,并检索与其中任何一个匹配的文档。我的索引方法是:

 Document document = new Document();
 document.add(new TextField("termos", text, Field.Store.YES));
 document.add(new TextField("docNumber",fileNumber,Field.Store.YES));

 config = new IndexWriterConfig(analyzer);
 Analyzer analyzer = CustomAnalyzer.builder()
            .withTokenizer("standard")
            .addTokenFilter("lowercase")
            .addTokenFilter("stop")
            .addTokenFilter("porterstem")
            .addTokenFilter("capitalization")
            .build();
 config = IndexWriterConfig(analyzer);
 writer = new IndexWriter(indexDirectory, config);
 writer.addDocument(document);
 writer.commit();

这是我的搜索方法。我不想寻找特定的词组,但是其中的任何单词。用于搜索的分析器与用于索引的分析器相同。

Query query = new QueryBuilder(analyzer).createPhraseQuery("termos","THE_PHRASE");
String indexDir = rootProjectFolder + "/indexDir/";
IndexReader reader = DirectoryReader.open(indexDir);
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(1000,1000);
searcher.search(query,collector);

我是Lucene的新手。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

使用createPhraseQuery("termos", "list of words")将精确地尝试将短语“单词列表”与短语坡度0匹配。

如果要在单词列表中匹配任何项,则可以使用createBooleanQuery

new QueryBuilder(analyzer).createBooleanQuery("termos", terms, BooleanClause.Occur.SHOULD);

作为替代方案,您也可以使用createMinShouldMatchQuery(),以便您需要查询词条数量的一小部分来进行匹配,例如。至少匹配百分之十的字词:

new QueryBuilder(analyzer).createMinShouldMatchQuery("termos", terms, 0.1f));