欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate search 学习笔记

程序员文章站 2022-04-15 23:45:23
...

1 使用hibernate search 时,当你的字段加入了索引,而进行搜索的时候去没搜索出来,那可能是你在实体字体里使用的分词器和作为搜索时使用的分词器不同所造成的,这个要注意一致性。还有一个就是就是可能你分词的时候将词变成乱码,

即由于对中文支持不好造成的,这个也会导致搜索的时候没找出来。


2 使用hibernate search 多字段查询可以如下方式:

StandardAnalyzer analyzer = new StandardAnalyzer();
			MultiFieldQueryParser parser = new MultiFieldQueryParser(//这个是用户输入的的搜索串在下面的field里进行搜索
					new String[] { "title","description","post_user_username" }, analyzer);
			parser.setDefaultOperator(QueryParser.OR_OPERATOR);
			BooleanQuery query = new BooleanQuery();
			query.add(parser.parse(content),BooleanClause.Occur.MUST);
			
			QueryParser parser2=new QueryParser("post_obj_objectID",analyzer);//从指定的ID里搜索,也就是首先在满足这个条件,再去搜索用户输入的查询串
			query.add(parser2.parse(objectPK) , BooleanClause.Occur.MUST);
			
			Query hibQuery = fullTextSession.createFullTextQuery(query,Posts.class);
 

 

使用MultiFieldQueryParser类来复合查询域,里面指定要搜索的field,这里是从"title","description",

"post_user_username"三个域里进行搜索,其中,post_user_username这个是在待搜索的实体Posts类里关联的

实体的一个索引域,也就是在Post实体里加入了@IndexedEmbedded(prefix="post_user_", depth=1)注解在关联

的实体(User user;)上,使得,可以从Post里去查询出它的user,那么只要在User实体里一个属性上面加入如下:

@Field(name = "username", index = Index.UN_TOKENIZED, store = Store.YES)形式的信息,便可完成跨

实体的查询。


3 使用FullTextQuery可以返回结果集,如下:

 

 

org.hibernate.search.FullTextQuery = hibQueryfullTextSession.createFullTextQuery(luceneQuery,Question.class);
int count = hibQuery.getResultSize();
 

 

这样就可以不用先获取一个list所有的对象信息后再求它的size,这样速度会快很多,因为不用对大量对象进行从数据库到的封装。



注:自己是在原来项目里接手做的,由于原来的项目里用的lucene版本比较低(用的是lucene2.4.1,hibernate search是3.1.1),所以有些方法和现在高版本的方法不同。

相关标签: Hibernate