0

我遇到了 Lucene 的问题,我希望有人能给我一个想法,我做错了什么。

我正在使用 lucene 4.4,并且正在使用 StandardAnalyser。我正在尝试在一个字段上进行搜索,但我得到了一个奇怪的结果。

例如,当我搜索单词“gros*”时,结果返回带有“grossesse”的记录。这很好,正如预期的那样。但是当我用“gross*”搜索时,它什么也没找到。

知道我做错了什么吗?有没有我缺少的设置?任何帮助或想法将不胜感激。

谢谢

这是我的索引

private void createIndex(Analyzer analyzer, String catalogueId, Locale locale, Directory index) throws IOException {

    IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_44, analyzer); 
    IndexWriter w = new IndexWriter(index, config); 
    Document doc = null;

    for (ProduitCatalogue produitCatalogue : produitCataloguesMap.get(catalogueId + locale.getLanguage()).values()) {
        doc = new Document();
        doc.add(new IntField("id", produitCatalogue.getId(), Store.YES));
        TextField desc = new TextField("description", produitCatalogue.getDescription(), Store.YES);
        doc.add(desc);
        w.addDocument(doc);
    }

    w.close();
    }
}   

这是我的 createQuery

private Query createQuery(String searchTxt, Analyzer analyzer) throws ParseException {

    QueryParser queryParser = new QueryParser(Version.LUCENE_44, "description", analyzer);
    queryParser.setAllowLeadingWildcard(true);
    queryParser.setAutoGeneratePhraseQueries(false);    
    Query q = queryParser.parse(searchTxt);

    return q;
}

这是我的分析仪

Analyzer analyzer = englishAnalyzer;

if (Locale.CANADA_FRENCH.getLanguage().equals(locale.getLanguage())) {
    analyzer = frenchAnalyzer;
}

Query q = createQuery(searchTxt, analyzer);
DirectoryReader reader = DirectoryReader.open(indexMap.get(catalogueId + locale.getLanguage()));
IndexSearcher searcher = new IndexSearcher(reader);
TopScoreDocCollector collector = TopScoreDocCollector.create(HITS_PER_PAGE, true);
searcher.search(q, collector);
ScoreDoc[] hits = collector.topDocs().scoreDocs;
4

1 回答 1

2

前缀查询(以及通配符、模糊和正则表达式查询)不通过分析器。由于您使用的是特定于语言的分析器(EnglishAnalyzerFrenchAnalyzer),因此通过分析器传递的索引数据将被提取。我猜想,在词干之后,“grossesse”被索引为词干“gros”。我想,在没有通配符的情况下搜索“总”会得到一个成功(尽管我没有仔细研究相关的词干逻辑来绝对肯定地说)。

允许词干查询和通配符查询的一种可能方法是在两个字段中索引数据,一个使用语言分析器进行词干提取,另一个使用StandardAnalyzer. 您可以始终搜索两者,也可以根据查询中的内容有选择地搜索。特别是对于用户输入的查询,同时搜索两个字段将是我认为的正确方法。

于 2013-08-23T20:29:49.377 回答