WildcardQuery Lucene无法正常工作

时间:2015-04-29 13:59:23

标签: java lucene

我正在尝试使用WildCardQuery:

    IndexSearcher indexSearcher = new IndexSearcher(ireader);
    Term term = new Term("phrase", QueryParser.escape(partOfPhrase) + "*");
    WildcardQuery wildcardQuery = new WildcardQuery(term);
    LOG.debug(partOfPhrase);
    Sort sort = new Sort(new SortField("freq", SortField.Type.LONG,true));
    ScoreDoc[] hits = indexSearcher.search(wildcardQuery, null, 10, sort).scoreDocs;

但是当我插入" san" (没有引号),我希望得到类似的东西: " san diego"," san antonio"但是我不仅得到了这些结果,而且还得到了"凉鞋" (它必须是san之后的空间),或juelz santana(我想找到以san开头的句子)。我该如何解决这个问题?

修改 另外,如果我插入" san d",我没有结果。

1 个答案:

答案 0 :(得分:1)

解决该问题的一种可能方法是使用另一个分析器,它不会按空间分割文档中的查询和文本。

可能的分析器之一 - KeywordAnalzer ,它将整个数据用作单个关键字

测试的基本部分:

Directory dir = new RAMDirectory();
Analyzer analyzer = new KeywordAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);
IndexWriter writer = new IndexWriter(dir, iwc);

稍后,我可以添加所需的文档:

Document doc = new Document();
doc.add(new TextField("text", "san diego", Field.Store.YES));
writer.addDocument(doc);

最后,根据需要进行搜索:

IndexReader reader = DirectoryReader.open(dir);
IndexSearcher searcher = new IndexSearcher(reader);

Term term = new Term("text", QueryParser.escape("san ") + "*");
WildcardQuery wildcardQuery = new WildcardQuery(term);

我的测试工作正常,允许我检索 san diego san antonio 而不是凉鞋。在这里看一下完整的测试 - https://github.com/MysterionRise/information-retrieval-adventure/blob/master/src/main/java/org/mystic/lucene/WildcardQueryWithSpace.java

有关分析器本身的更多信息 - http://lucene.apache.org/core/4_10_2/analyzers-common/org/apache/lucene/analysis/core/KeywordAnalyzer.html