hibernate search 学习笔记
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查询
推荐阅读
-
韩顺平_PHP软件工程师玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理
-
Apache Mina 学习笔记(1) - 入门
-
Python学习笔记--Python 爬虫入门 -17-11 tesseract-OCR
-
opencv学习笔记三十四:透视变换
-
ASP.NET学习笔记(五)-全球化部署,网站发布方法,AJAX使用,水晶报表使用,DropDownList,CheckBox全选
-
【OpenCV学习笔记】之仿射变换(Affine Transformation)
-
【莫烦强化学习】视频笔记(二)3.Q_Learning算法实现走迷宫
-
Python基础学习笔记
-
php扩展学习笔记
-
MySQL学习笔记之二十四 撤销用户和授权_MySQL