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

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

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

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

1:导包:
Lucene的jar:
Hibernate的jar:(required)
数据库jar:
分词器 jar:
这里写图片描述

2:2:hibernate 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
       "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
       "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
       <session-factory>  
             <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>          
             <property name="hibernate.connection.url">jdbc:mysql:///crm</property>           
             <property name="hibernate.connection.username">root</property>          
             <property name="hibernate.connection.password">root</property>
             <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

             <property name="hibernate.show_sql">true</property>       
             <property name="hibernate.format_sql">true</property>
             <property name="hibernate.hbm2ddl.auto">update</property>
             <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;
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<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<Items> getItems(){
        Session session = sessionFactory.openSession(); 
        Query query = session.createQuery("FROM cn.Items ");
        List<Items> list = query.list();
        return list;
    }


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

        List<Items> 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();
        List<Items>items = 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);
            }




    }


}

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

这里写图片描述

注:我这里使用的是在静态代码块获取的session的工厂,使用的是opensession方法,这样每次都是新的session,如果大家使用session过多,要使用getcurrentSsssion方法,可以自己写一个获取session的工具类,
使用单例的设计模式,与线程绑定,或者在配置文件中配置,session与本地线程绑定name="hibernate.cureent_session_context_class">Thread</property>来实现获取当前session
简单的luncene与数据库结合,就实现了。其他的索引增删改查就就跟前面一样了。
返回lucene/slor文章的目录:http://blog.csdn.net/m15517986455/article/details/78986856
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Lucene 是一个开源的全文检索引擎,可以用来构建高效的搜索应用程序。在 Java 中使用 Lucene 构建问答引擎可以实现以下功能: 1. 对问题进行分词和索引,以便快速定位相关答案。 2. 对答案进行分词和索引,并使用相关性算法来计算答案与问题的相似度。 3. 提供自然语言查询接口,让用户可以输入问题并获取相关答案。 4. 支持多种数据源,如数据库、文件等。 下面是一个简单的 Lucene 问答引擎示例: 1. 首先需要创建一个问答索引,包括问题、答案和其他相关信息: ```java public class QaIndexer { private Directory directory; private Analyzer analyzer; private IndexWriterConfig config; private IndexWriter writer; public QaIndexer(Path indexPath) throws IOException { directory = FSDirectory.open(indexPath); analyzer = new StandardAnalyzer(); config = new IndexWriterConfig(analyzer); writer = new IndexWriter(directory, config); } public void indexQuestion(String question, String answer, String category) throws IOException { Document doc = new Document(); doc.add(new TextField("question", question, Field.Store.YES)); doc.add(new TextField("answer", answer, Field.Store.YES)); doc.add(new StringField("category", category, Field.Store.YES)); writer.addDocument(doc); } public void commit() throws IOException { writer.commit(); } public void close() throws IOException { writer.close(); directory.close(); } } ``` 2. 然后创建一个搜索器,用于搜索问题并返回相关答案: ```java public class QaSearcher { private Directory directory; private IndexReader reader; private IndexSearcher searcher; public QaSearcher(Path indexPath) throws IOException { directory = FSDirectory.open(indexPath); reader = DirectoryReader.open(directory); searcher = new IndexSearcher(reader); } public List<String> search(String query, int numHits) throws IOException { QueryParser parser = new QueryParser("question", new StandardAnalyzer()); Query q = parser.parse(query); TopDocs docs = searcher.search(q, numHits); List<String> results = new ArrayList<>(); for (ScoreDoc scoreDoc : docs.scoreDocs) { Document doc = searcher.doc(scoreDoc.doc); String answer = doc.get("answer"); results.add(answer); } return results; } public void close() throws IOException { reader.close(); directory.close(); } } ``` 3. 最后,将索引和搜索器结合起来,实现一个简单的问答引擎: ```java public class QaEngine { private QaIndexer indexer; private QaSearcher searcher; public QaEngine(Path indexPath) throws IOException { indexer = new QaIndexer(indexPath); searcher = new QaSearcher(indexPath); } public void indexQuestion(String question, String answer, String category) throws IOException { indexer.indexQuestion(question, answer, category); } public List<String> search(String query, int numHits) throws IOException { return searcher.search(query, numHits); } public void commit() throws IOException { indexer.commit(); } public void close() throws IOException { indexer.close(); searcher.close(); } } ``` 这个问答引擎可以用来回答用户输入的问题,例如: ```java QaEngine engine = new QaEngine(Paths.get("index")); engine.indexQuestion("What is Lucene?", "Lucene is a full-text search engine library written in Java", "technology"); engine.commit(); List<String> results = engine.search("What is Lucene?", 10); for (String result : results) { System.out.println(result); } engine.close(); ``` 输出: ``` Lucene is a full-text search engine library written in Java ``` ### 回答2: Java Lucene问答引擎是一个使用Java编写的,基于Lucene搜索引擎的问答系统案例。该系统旨在通过自动化处理问题和提供相关答案来帮助用户解决问题。 该问答引擎案例的实现过程如下: 1. 数据收集:首先,系统需要收集大量的问题和答案数据。可以从已有的问答社区、论坛或其他数据源中获取问题和对应的答案。 2. 数据预处理:收集到数据后,需要对其进行预处理。这包括文本清洗、分词和词干提取等处理,以便为后续的检索和匹配做准备。 3. 索引构建:使用Lucene的倒排索引技术,将问题和答案数据构建成一个索引库。这将提高后续的搜索效率。 4. 问题解析:当用户提出一个问题时,系统需要对该问题进行解析,以确定用户的意图和需要的答案类型。这可以通过自然语言处理技术,如词性标注、依存句法分析等来实现。 5. 答案检索:通过用户提出的问题,使用索引库进行问题匹配和检索,找出与问题最相关的答案。这可以使用Lucene提供的查询和检索功能来实现。 6. 答案排序:根据答案的相关性和质量,对检索到的答案进行排序,并选择最佳的答案作为结果返回给用户。排序可以使用相关性算法,如TF-IDF、BM25等来实现。 7. 用户界面:为用户提供一个友好的界面,让用户输入问题并显示搜索结果。这可以通过Web界面或命令行界面来实现。 通过以上步骤,Java Lucene问答引擎可以实现自动化的问题回答功能。用户可以输入问题,系统可以自动解析用户意图并给出相关答案。这在知识库问答、智能客服、语义搜索等领域都有广泛的应用前景。 ### 回答3: Java Lucene问答引擎是一个基于Java语言和Lucene搜索引擎的案例,旨在提供用户使用自然语言进行询问并获得准确答案的功能。 该问答引擎的实现过程主要包括以下几个步骤: 1. 数据准备:首先,需要准备一个问题和答案的数据集,一般可以使用已有的知识库或者文档集合,将其进行预处理和索引构建,以便于快速检索。 2. 分析和预处理:使用Lucene的分词器对问题和答案进行分词处理,并进行相关的预处理操作,如去除停用词、词干化等,以便于能够更好地匹配和搜索。 3. 构建索引:使用Lucene的索引功能,将预处理后的问题和答案构建成索引结构,以便于后续的查询和匹配操作。 4. 用户查询:用户通过输入自然语言的问题,问答引擎将对其进行分析、预处理,并根据索引结构进行查询。 5. 匹配和排序:根据用户查询的关键词和索引中的问题进行匹配,使用相应的算法对匹配结果进行排序,以便于展示最为相关和准确的答案。 6. 结果展示:将排序后的答案进行展示,并提供相应的界面和交互形式,以便于用户能够直观地获得问题的答案。 Java Lucene问答引擎案例的实现可以帮助用户更方便地获取问题的答案,尤其在一些知识库比较庞大和复杂的情况下,能够大大提高问题解答的效率和准确性。同时,可以根据具体的需求和业务场景对该引擎进行定制和扩展,以适应不同的功能和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值