我使用Hibernate Lucene索引表MOVIE。我想按标题列进行索引和搜索,包括""和" a"作为搜索的一部分。前,"最后一个站着的人#34; "最想要的男人"。 "该"和" A"是相关的搜索结果的一部分。
问题是如果我在@Field中使用index = Index.UN_TOKENIZED,则无法进行搜索。如果我使用了Index.TOKENIZED,那么我就无法用"""和" a"。
有人可以给我一些指导吗?提前谢谢。
以下是代码段:
@Field(index = Index.UN_TOKENIZED,store = Store.NO)<<<我也试过了Index.TOKENIZED。 @Column(name =" TITLE") 私有字符串标题;
搜索代码:
@Field(index = Index.UN_TOKENIZED, store = Store.NO) <<< I've tried Index.TOKENIZED also.
@Column(name =&#34; TITLE&#34;) 私有字符串标题;
搜索代码: FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()。buildQueryBuilder()。forEntity(Movie.class).get(); 查询luceneQuery = queryBuilder.keyword()。onField(&#34; title&#34;) .matching(title.toLowerCase())的createQuery();
返回fullTextEntityManager.createFullTextQuery(luceneQuery,Movie.class) .getResultList();
答案 0 :(得分:0)
我认为这是一种解决方案,通过定义分析器。这将标记,但不会排除常用词&#34;&#34;。 此外,在搜索代码中,使用方法QueryBuilder.phrase()而不是keyword(),以便根据搜索短语执行搜索。
@AnalyzerDef(name =&#34; custom&#34;,tokenizer = @TokenizerDef(factory = StandardTokenizerFactory.class),filters = { @TokenFilterDef(factory = LowerCaseFilterFactory.class), @TokenFilterDef(factory = SnowballPorterFilterFactory.class,params = {@Parameter(name =&#34; language&#34;,value =&#34; English&#34;)})}) 公共课电影{
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
@Analyzer(definition="custom")
private String title;
... }
搜索代码: QueryBuilder qb = fullTextEntityMgr.getSearchFactory() 。.buildQueryBuilder()forEntity(Movie.class)获得();
查询luceneQuery = qb.phrase()。onField(&#34; title&#34;)。sentence(term.toLowerCase())。createQuery(); javax.persistence.Query query = fullTextEntityMgr.createFullTextQuery(luceneQuery,Movie.class);