Search Lucene找不到预期的数据
我和Lucene有问题,我希望有人能告诉我我做错了什么 我用的是lucene 4.4和StandardAnalyzer。我试图在一个领域做搜索,但我得到一个奇怪的结果 例如,当我搜索单词“gros*”时,结果返回带有“grossess”的记录。这很好,正如预期的那样。但当我用“gross*”搜索时,它什么也找不到 知道我做错了什么吗?有没有我错过的场景? 任何帮助或想法都将不胜感激 谢谢 这是我的索引Search Lucene找不到预期的数据,search,lucene,Search,Lucene,我和Lucene有问题,我希望有人能告诉我我做错了什么 我用的是lucene 4.4和StandardAnalyzer。我试图在一个领域做搜索,但我得到一个奇怪的结果 例如,当我搜索单词“gros*”时,结果返回带有“grossess”的记录。这很好,正如预期的那样。但当我用“gross*”搜索时,它什么也找不到 知道我做错了什么吗?有没有我错过的场景? 任何帮助或想法都将不胜感激 谢谢 这是我的索引 private void createIndex(Analyzer analyzer, Str
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;
前缀查询(以及通配符、模糊和正则表达式查询)不会通过分析器传递。由于您使用的是特定于语言的分析器(EnglishAnalyzer
和FrenchAnalyzer
),因此通过分析器传递的索引数据将被阻止。我猜,在词干化之后,“grossess”被索引为词干“gros”。我想,在没有通配符的情况下搜索“gross”会很成功(不过我还没有完全肯定地通过相关的词干逻辑来这么说)
允许词干和通配符查询的一种可能方法是在两个字段中对数据进行索引,一个使用语言分析器词干,另一个使用StandardAnalyzer
。您可以始终同时搜索,也可以根据查询中的内容有选择地搜索。特别是对于用户输入的查询,同时搜索两个字段将是我考虑的正确方法