NGramFilterFactory 无法正常工作
NGramFilterFactory does not work correctly
我想从文本中提取关键词
例如,如果 nameEn = "Hello everybody TODAY" 并且我搜索关键字 "body" 它会显示结果
我使用了注释 AnalyzerDef,但我的代码有问题
我会解释问题的:
nameEn = "Hello everybody TODAY"
例如,当我搜索 "b" 时,它会显示结果
但是当我搜索 "bo" 或 "bod" 或 "body" 时,它什么也没显示
现在当我将 minGramSize 更改为 2
当我搜索 "bo" 时,它会显示结果
还有其他关键词"b"、"bod"、"body"什么都没显示
我不知道具体问题出在哪里,因为根据下面的代码,当我输入"bo"
输出将是:"b"、"bo"
@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;
}
感谢任何帮助
您可以尝试使用关键字查询而不是词组查询:queryBuilder.keyword().onField("nameEn").boostedTo(5).matching(keyWord.toLowerCase()).createQuery();
如果正如您的分析器名称所示,您正在执行自动完成,则短语查询可能不相关。无论如何,这将是让东西正常工作的第一步。
附带说明一下,您可能希望在分析查询时阻止生成 n-gram(尤其是当您需要短语查询时)。有关更多信息,请参阅此答案中的“EDIT”部分:Hibernate search to find partial matches of a phrase
我想从文本中提取关键词
例如,如果 nameEn = "Hello everybody TODAY" 并且我搜索关键字 "body" 它会显示结果
我使用了注释 AnalyzerDef,但我的代码有问题
我会解释问题的:
nameEn = "Hello everybody TODAY"
例如,当我搜索 "b" 时,它会显示结果
但是当我搜索 "bo" 或 "bod" 或 "body" 时,它什么也没显示
现在当我将 minGramSize 更改为 2
当我搜索 "bo" 时,它会显示结果
还有其他关键词"b"、"bod"、"body"什么都没显示
我不知道具体问题出在哪里,因为根据下面的代码,当我输入"bo"
输出将是:"b"、"bo"
@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;
}
感谢任何帮助
您可以尝试使用关键字查询而不是词组查询:queryBuilder.keyword().onField("nameEn").boostedTo(5).matching(keyWord.toLowerCase()).createQuery();
如果正如您的分析器名称所示,您正在执行自动完成,则短语查询可能不相关。无论如何,这将是让东西正常工作的第一步。
附带说明一下,您可能希望在分析查询时阻止生成 n-gram(尤其是当您需要短语查询时)。有关更多信息,请参阅此答案中的“EDIT”部分:Hibernate search to find partial matches of a phrase