【发布时间】:2019-03-07 05:18:44
【问题描述】:
这是我第一次处理优化的搜索功能,我的部分熟练程度是在 android 开发的前端,但我愿意冒险尝试 hibernate-search。我确实了解 SQL“LIKE”查询的功能,它的作用及其限制,这就是我直接跳到休眠搜索(lucene)的原因,我的目标是根据输入(输入查询)提供自动建议.这就是我目前所得到的
@Indexed
@Table (name = "shop_table")
@Entity
@AnalyzerDef(name = "myanalyzer",
tokenizer = @TokenizerDef(factory = KeywordTokenizerFactory.class), //
filters = { //
@TokenFilterDef(factory = LowerCaseFilterFactory.class),
@TokenFilterDef(factory = WordDelimiterFilterFactory.class),
@TokenFilterDef(factory = EdgeNGramFilterFactory.class, params =
{ @Parameter(name = "maxGramSize", value = "1024") }),})
@Analyzer(definition = "myanalyzer")
public class Shop implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
enter code here
@Field(index = Index.YES, store = Store.YES, analyze = Analyze.YES)
@Column(name = "name")
private String name;
... other methods
我的查询
Query lucenQuery = qb.keyword().onField("name").matching(searchTerm).createQuery();
它只是一个基本查询,我只专注于分析器配置以获得我想要的东西,它真的很困惑我应该关注哪个部分来实现我想要的东西,令牌化?过滤?还是查询本身? 无论如何,我已经将这 2 个短语编入索引。
"Apache Lychee Department"
"Apache Strawberry Club Large"
当我处理/查询“Straw”时,它会给我 Apache Strawberry Club Large 但是当我处理/查询“Lychee”或“Apache Lychee”时,查询给了我两个?我只期待Apache荔枝系
我理解我所有配置的方式是/是
EdgeNGramFilterFactory (1024) 会给我一系列 1,024 的 EdgeNGrams 索引
LowerCaseFilterFactory 会给我所有小写的索引
WordDelimiterFilterFactory通过将查询作为一个单词对其进行过滤,并给我匹配的数据。
每个条目/数据都将被 KeywordTokenizerFactory 标记为关键字,并将被 EdgeNGram 索引为 1,024
我尝试查询一个短语,但仍然得到相同的输出
Query luceneQuery = qb.phrase().onField("name").sentence(searchTerm).createQuery();
我的目标是有一个自动建议.. 或者至少从模仿 sql 的“LIKE”开始..
【问题讨论】:
标签: hibernate lucene hibernate-search lexical-analysis