lucene的第十一篇——Lucene与数据库结合案例

Lucene+hibernate 开发:
这里主要是巩固写代码。没有新增技术知识, luncene跟数据库结合是我们开发中常用的。但实际上,都是一样的。 本篇主要使用的是 lucene+hibernate 编写代码;其他的操作数据库,都一样的。 数据库储存内容:
只要能实现场景需求一,那么这个也很简单

数据库储存内容:
这里写图片描述

 需求:找出哪个东西,属性中有“容量”的词语,
 分析:就是通过“容量”搜索出对应的数据库中的记录

1:导包:
Lucene的jar:
Hibernate的jar:(required)
数据库jar:
分词器 jar:
lucene的第十一篇——Lucene与数据库结合案例_第1张图片

2:2:hibernate 配置文件:



<hibernate-configuration>
       <session-factory>  
             <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driverproperty>          
             <property name="hibernate.connection.url">jdbc:mysql:///crmproperty>           
             <property name="hibernate.connection.username">rootproperty>          
             <property name="hibernate.connection.password">rootproperty>
             <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialectproperty>

             <property name="hibernate.show_sql">trueproperty>       
             <property name="hibernate.format_sql">trueproperty>
             <property name="hibernate.hbm2ddl.auto">updateproperty>
             <property                     
            <mapping resource="cn/items.xml" />           
       session-factory>
hibernate-configuration>

3:实体类和映射文件:

//省略了getter setter方法
public class Items {




    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

    private String detail;


<hibernate-mapping package="cn" >
       <class name="Items" table="items" >
              <id name="id" >
               <generator class="native">
               generator>
             id>
             <property name="name"  >property>
             <property name="price"  >property>
             <property name="pic"  >property>
             <property name="createtime"  >property>
             <property name="detail"  >property>

       class>
hibernate-mapping>

4:代码:


public class luceneTest {
private static SessionFactory sessionFactory;
//加载配置文件
    static{
        sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();

    }

//获取原始数据
    public List getItems(){
        Session session = sessionFactory.openSession(); 
        Query query = session.createQuery("FROM cn.Items ");
        List list = query.list();
        return list;
    }


    //测试hibernate
    @Test
    public void test(){

        List items = getItems();
        System.out.println(items);

    }





//获取indexwriter对象
    public IndexWriter getIndexwriter() throws IOException{
        Directory directory = FSDirectory.open(new File("G:\\a\\v"));
        //获取分词器
      Analyzer analyzer = new IKAnalyzer();
      //获取indexwriterconfig对象
      IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
      return new IndexWriter(directory,indexWriterConfig);




    }

    @Test
    public void creatIndex() throws IOException{

        IndexWriter indexwriter = getIndexwriter();
        Listitems = getItems();
        for (Items item : items) {

            Document document = new Document();

          String name = item.getName();
          Date createtime = item.getCreatetime();
          String detail = item.getDetail();
          Float price = item.getPrice();
          Field Itemname = new TextField("name",name,Store.YES);
          Field Itemcreatetime = new TextField("createtime",String.valueOf(createtime),Store.YES);
          Field Itemdetail = new TextField("detail",String.valueOf(detail),Store.YES);
          Field Itemprice = new TextField("price",String.valueOf(price),Store.YES);
          document.add(Itemname);   
          document.add(Itemcreatetime); 
          document.add(Itemdetail); 
          document.add(Itemprice);  

          indexwriter.addDocument(document);

        }

        indexwriter.close();


    }


    @Test
    public void search() throws IOException{

        //获得directory对象
        FSDirectory directory = FSDirectory.open(new File("G:\\a\\v"));
        //获得indexreader对象
        IndexReader reader =DirectoryReader.open(directory);
        //获得查询对象
        IndexSearcher indexSearcher = new IndexSearcher(reader);

        //获取要查询的语汇单元
        Term term = new Term("detail","容量");

        TermQuery query = new TermQuery(term);

        //进行查询
        TopDocs topDocs = indexSearcher.search(query, 2);
     // 取得结果集
            ScoreDoc[] scoreDocs = topDocs.scoreDocs;
            for (ScoreDoc scoreDoc : scoreDocs) {
                // 根据文档对象ID取得文档对象
                Document document = indexSearcher.doc(scoreDoc.doc);
                System.out.println();
                IndexableField field = document.getField("name");
                String stringValue = field.stringValue();
                System.out.println("描述中含有容量的item 名字是:"+stringValue);
            }




    }


}

//=========================================================================
依次执行 :创建索引方法,和查询方法:
运行结果:

lucene的第十一篇——Lucene与数据库结合案例_第2张图片

注:我这里使用的是在静态代码块获取的session的工厂,使用的是opensession方法,这样每次都是新的session,如果大家使用session过多,要使用getcurrentSsssion方法,可以自己写一个获取session的工具类,
使用单例的设计模式,与线程绑定,或者在配置文件中配置,session与本地线程绑定name="hibernate.cureent_session_context_class">Threadproperty>来实现获取当前session
简单的luncene与数据库结合,就实现了。其他的索引增删改查就就跟前面一样了。

返回lucene/slor文章的目录:http://blog.csdn.net/m15517986455/article/details/78986856

你可能感兴趣的:(lucene,/slor)