我想从一个文本NGramFilterFactory不能正常工作
提取关键词例如,如果nameEn =“大家好今天”,我做的关键字搜索“身体”它让我看到结果
我用注释AnalyzerDef,但我有我的代码有问题
我会解释这个问题:
nameEn =“大家好今天”
例如,当我搜索“B”,它让我看到结果
但是,当我搜索“博”,“董事会”或“身体”,它显示了我什么
现在,当我改变minGramSize 2
当我搜索“微博”,它让我看到结果
而其他关键词“b”,“董事会”,“身体”它让我看到什么
我做不知道问题究竟在哪里,因为根据下面的代码,当我进入红色的 “博”
输出将是: “B”, “博”
@Indexed
@AnalyzerDef(name = "autocompleteNGramAnalyzer", tokenizer =
@TokenizerDef(factory = StandardTokenizerFactory.class), filters = {
@TokenFilterDef(factory = WordDelimiterFilterFactory.class),
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = NGramFilterFactory.class, params = {
@Parameter(name = "minGramSize", value = "1"),
@Parameter(name = "maxGramSize", value = "50") }),
@TokenFilterDef(factory = PatternReplaceFilterFactory.class, params = {
@Parameter(name = "pattern", value = "([^a-zA-Z0-9\\.])"),
@Parameter(name = "replacement", value = " "), @Parameter(name = "replace", value = "all") }) })
@Analyzer(definition = "autocompleteNGramAnalyzer")
public class Product implements Serializable {
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String nameEn;
的搜索方法:
public List<Product> searchProduct(String keyWord) {
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
try {
fullTextSession.createIndexer().startAndWait();
} catch (InterruptedException e) {
e.printStackTrace();
}
QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Product.class).get();
org.apache.lucene.search.Query luceneQuery = queryBuilder.phrase().withSlop(2).onField("nameEn").boostedTo(5).sentence(keyWord.toLowerCase()).createQuery();
org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, Product.class);
List<Product> result = fullTextQuery.list();
return result;
}
任何帮助表示赞赏
我用同样的例子,但是当我用EdgeNGramTokenFilter.class它表明我这个错误:类型不匹配:不能从类转换到类<?扩展TokenFilterFactory> –
@AymenKanzari对,在例子中出现了一个错字:EdgeNGramTokenFilter.class应该是EdgeNGramTokenFilterFactory.class。我修正了这个例子。 –
注意:没有EdgeNGramTokenFilterFactory.class,有EdgeNGramFilterFactory.class。我也有同样的问题。例如: nameEn = [Juno Taylor,Tom Caner Junior,Alan Smith,John Cane,这款休闲衬衫有一个普通领子...]。 'jun'返回Juno Taylor和Tom Caner Junior, 'an'应该会返回Alan Smith,John Cane,Tom Caner Junior和这款休闲衬衫有一个中国领......但它不会返回 'a'或' n'应该全部返回,但它什么都不返回 –