Lucene:用部分单词搜索

时间:2017-05-03 10:01:40

标签: java search lucene

我正在努力将Lucene集成到我们的应用程序中。 Lucene目前正在工作,例如当我搜索“上传”并且文档中有一些名为“上传”的文本时,它可以工作,但是当我搜索“Uplo”时,它就不起作用了。有任何想法吗?

代码:

  Directory directory = FSDirectory.open(path);
                IndexReader indexReader = DirectoryReader.open(directory);
                IndexSearcher indexSearcher = new IndexSearcher(indexReader);

                QueryParser queryParser = new QueryParser("contents", new SimpleAnalyzer());
                Query query = queryParser.parse(text);
                TopDocs topDocs = indexSearcher.search(query, 50);
                for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                    org.apache.lucene.document.Document document = indexSearcher.doc(scoreDoc.doc);
                    objectIds.add(Integer.valueOf(document.get("id")));
                    System.out.println("");
                    System.out.println("id " + document.get("id"));
                    System.out.println("content " + document.get("contents"));
                }
                return objectIds;

谢谢。

3 个答案:

答案 0 :(得分:2)

'上传'可能是您的Lucene索引中的一个令牌,其中令牌将是不可拆分的最小实体。如果你想匹配像'Uplo'这样的部分单词,那么最好选择Lucene NGram Indexing。请注意,如果您使用NGram索引,则倒排索引的空间要求会更高。

答案 1 :(得分:0)

您可以使用通配符搜索。

""单字符通配符搜索的符号和" *"多字符通配符搜索的符号(0个或更多字符)。

示例 - " Uplo *"

答案 2 :(得分:0)

更改

Query query = queryParser.parse(text);

 Query query = queryParser.parse("*"+text+"*");

Lucene支持单个术语内的单个和多个字符通配符搜索(不在短语查询中)。

要执行单字符通配符搜索,请使用"?"符号

要执行多字符通配符搜索,请使用" *"符号

单字符通配符搜索会查找与替换的单个字符匹配的字词。例如,要搜索" text"或"测试"你可以使用搜索:

te?t

多字符通配符搜索会查找0个或更多字符。例如,要搜索测试,测试或测试人员,您可以使用搜索:

test*

您还可以在学期中使用通配符搜索。

te*t

注意:您不能使用*或?符号作为搜索的第一个字符。