Lucene NGramFilterFactory无法正常工作

Lucene NGramFilterFactory无法正常工作,lucene,full-text-search,hibernate-search,analyzer,Lucene,Full Text Search,Hibernate Search,Analyzer,我想从文本中提取关键字 例如,如果nameEn=“Hello Everyone TODAY”,我搜索关键字“body”,它会显示结果 我使用了注释AnalyzerDef,但我的代码中有一个问题 我会解释问题: nameEn=“今天大家好” 例如,当我搜索“b”时,它会显示结果 但当我搜索“bo”或“bod”或“body”时,它什么也没有显示 现在,当我将minGramSize更改为2时 当我搜索“bo”时,它会显示结果 还有其他关键词“b”,“bod”,“body”,它什么也没告诉我 我不知道问

我想从文本中提取关键字

例如,如果nameEn=“Hello Everyone TODAY”,我搜索关键字“body”,它会显示结果

我使用了注释AnalyzerDef,但我的代码中有一个问题

我会解释问题:

nameEn=“今天大家好”

例如,当我搜索“b”时,它会显示结果

但当我搜索“bo”或“bod”或“body”时,它什么也没有显示

现在,当我将minGramSize更改为2时

当我搜索“bo”时,它会显示结果

还有其他关键词“b”,“bod”,“body”,它什么也没告诉我

我不知道问题到底出在哪里,因为根据下面的代码,当我输入“bo”时

输出将为:“b”、“bo”

搜索方法:

    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;
}
公共列表搜索产品(字符串关键字){
FullTextSession FullTextSession=Search.getFullTextSession(getSession());
试一试{
fullTextSession.createIndexer().startAndWait();
}捕捉(中断异常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).句子(关键字.toLowerCase()).createQuery();
org.hibernate.Query fullTextQuery=fullTextSession.createFullTextQuery(luceneQuery,Product.class);
List result=fullTextQuery.List();
返回结果;
}

您可以尝试使用关键字查询而不是短语查询:
queryBuilder.keyword().onField(“nameEn”).boostedTo(5).匹配(keyword.toLowerCase()).createQuery()

如果,正如分析器的名称所示,您正在执行自动完成,那么短语查询可能与此无关。在任何情况下,这将是朝着让东西运转的方向迈出的第一步


另一方面,您可能希望在分析查询时防止生成n-gram(特别是在需要短语查询时)。有关此问题的更多信息,请参阅此答案中的“编辑””部分:

我使用了相同的示例,但当我使用EdgeNGramTokenFilter.class时,它向我显示了以下错误:类型不匹配:无法从类转换为类Class@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'应该返回所有,但是它返回nothing@AymenKanzari:EdgeNGramFilterFactory仅在代币的起始边缘生成ngrams,因此alan将转换为[“a”、“al”、“ala”、“alan”]。如果您真的想生成所有ngram,请用NGramFilterFactory替换我示例中的EdgeNGramFilterFactory。
    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;
}