仅 Hibernate 搜索 return 精确值
Hibernate search only return exact value
仅限我的程序 return 与搜索字符串完全相同的值:
trans = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
QueryBuilder qB = fullTextSession.getSearchFactory().buildQueryBuilder()
.forEntity(Customer.class).get();
org.apache.lucene.search.Query luceneQuery = qB.keyword()
.onFields("lastName").matching(searchString).createQuery();
Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery);
list = fullTextQuery.list();
例如:当搜索字符串为 'user' 时,我将得到列表,但当搜索字符串为 'User' 或 'Use' 时,我将得到空值。
我不知道你是如何索引你的字段的,看来你没有使用合适的分析器。阅读有关它的文档。
尝试使用使用休眠搜索注释和 Solr 分析器、分词器和过滤器的自定义分析器。
这是example可以帮助你开始:
@Entity
@Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
public class Book {
@Id
@GeneratedValue
@DocumentId
private Integer id;
@Field
@Analyzer(definition = "customanalyzer")
private String title;
@Field
@Analyzer(definition = "customanalyzer")
private String subtitle;
@IndexedEmbedded
@ManyToMany
private Set<Author> authors = new HashSet<Author>();
@Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
@DateBridge(resolution = Resolution.DAY)
private Date publicationDate;
public Book() {
}
// standard getters/setters follow here
...
}
使用此示例的分析器,您将能够找到 'User' 和 'user' ...
当您的关键字是 'Use' 时,为了能够找到 'user',您可以:
使用另一个分析器,例如“EdgeNGramFilterFactory”。
或像这样使用 wildcard queries:
查询luceneQuery = qb.keyword().wildcard().onField("lastName").matching("use*").createQuery();
文档很简单,学习Hibernate Search的最好方法就是阅读它。
仅限我的程序 return 与搜索字符串完全相同的值:
trans = session.beginTransaction();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.createIndexer().startAndWait();
QueryBuilder qB = fullTextSession.getSearchFactory().buildQueryBuilder()
.forEntity(Customer.class).get();
org.apache.lucene.search.Query luceneQuery = qB.keyword()
.onFields("lastName").matching(searchString).createQuery();
Query fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery);
list = fullTextQuery.list();
例如:当搜索字符串为 'user' 时,我将得到列表,但当搜索字符串为 'User' 或 'Use' 时,我将得到空值。
我不知道你是如何索引你的字段的,看来你没有使用合适的分析器。阅读有关它的文档。
尝试使用使用休眠搜索注释和 Solr 分析器、分词器和过滤器的自定义分析器。
这是example可以帮助你开始:
@Entity
@Indexed
@AnalyzerDef(name = "customanalyzer",
tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),
filters = {
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = SnowballPorterFilterFactory.class, params = {
@Parameter(name = "language", value = "English")
})
})
public class Book {
@Id
@GeneratedValue
@DocumentId
private Integer id;
@Field
@Analyzer(definition = "customanalyzer")
private String title;
@Field
@Analyzer(definition = "customanalyzer")
private String subtitle;
@IndexedEmbedded
@ManyToMany
private Set<Author> authors = new HashSet<Author>();
@Field(index = Index.YES, analyze = Analyze.NO, store = Store.YES)
@DateBridge(resolution = Resolution.DAY)
private Date publicationDate;
public Book() {
}
// standard getters/setters follow here
...
}
使用此示例的分析器,您将能够找到 'User' 和 'user' ...
当您的关键字是 'Use' 时,为了能够找到 'user',您可以:
使用另一个分析器,例如“EdgeNGramFilterFactory”。
或像这样使用 wildcard queries:
查询luceneQuery = qb.keyword().wildcard().onField("lastName").matching("use*").createQuery();
文档很简单,学习Hibernate Search的最好方法就是阅读它。