luceneAPI的简单使用(java)

lucene是一个全文检索引擎工具包,下面来简单的介绍下Lucene常用的API介绍

1:对一个文件下面的所有文件进行索引创建:


import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
 * 对一个文件里面的内容建立索引,包括文件名和文件的内容
 * 1:创建分词器。标准分词器
 * 2:创建IndexWriter    IndexWriter是索引过程中的核心组件
 * 3:创建document     创建Field 
 * 4:写入
 * 5:关闭资源
 * @author 韩利鹏
 */
public class CreateLocal {

    private static String file_dir = "D:/decstop/luceneTxt";// 带索引的本地文件目录
    // 索引存放目录
    private static String index_dir = "D:/decstop/index";

    public static void index(String filedir) throws Exception {
        //1:创建中文分词器
        //Analyzer analyzer = new StandardAnalyzer();   //lucene自带的标准分词器,对中文的分词支持不好,做中文的分词不建议使用
        Analyzer analyzer = new IKAnalyzer();   //IKAnalyzer是一个中文分词器,有中文的时候建议使用这个
        File indexfile = new File(index_dir);
        Directory directorty = FSDirectory.open(indexfile);
        IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        //2:创建indexwriter
        IndexWriter writer = new IndexWriter(directorty, cfg);

        // 遍历目录 循环读取文件 逐个建立文件索引
        File file = new File(filedir);
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isDirectory()) {
                index(f.getPath());
            } else {
                Document doc = new Document();
                // 文件名字
                // Store:如果是yes 则说明存储到文档中
                //Field name = new StringField("fileName", f.getName(), Store.YES);
                Field name = new TextField("fileName", f.getName(), Store.YES);
                // 文件内容
                BufferedReader reader = new BufferedReader(new FileReader(f));
                String temp = null;
                StringBuffer sb = new StringBuffer();
                while ((temp = reader.readLine()) != null) {
                    sb.append(temp);
                }
                reader.close();
                String context = sb.toString();

                // 把文件内容读到索引中去 这样在搜索索引时就能看到
                Field body = new TextField("context", context, Store.YES);
                doc.add(name);
                doc.add(body);
                writer.addDocument(doc);
            }
        }
        writer.close();

    }
    public static void main(String[] args) throws Exception {

        index(file_dir);
    }
}

2:搜索

package lucene;

import java.io.File;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;

/**
 * 搜索
 * 1:创建indexSercher 指定索引库的地址
 * 2:创建Query (查询条件)
 * 3:执行查询   
 * 4:遍历得出结果
 * 5:关闭资源
 * @author 韩利鹏
 */
public class SearchIndexOnLocal {
    public static void doSearch() throws Exception{
        //创建indexSearch     指定索引库的地址
        File indexFile =new File("D:/decstop/index");
        Directory directory =FSDirectory.open(indexFile);
        IndexReader reader = DirectoryReader.open(directory);
        IndexSearcher search = new IndexSearcher(reader);


        //创建query    参数一:搜索域 field name    第二个参数: 分词器 与添加的分词器一致
        QueryParser parser = new QueryParser("fileName", new StandardAnalyzer());
        //通过QueryParser对象创建query     参数为lucene的查询语句
        Query query = parser.parse("text1 OR text2");

        //通过indexSearcher来搜索索引     int 条数
        TopDocs topDocs = search.search(query, 10);
        //根据查询条件匹配出的记录总数
        int count= topDocs.totalHits;
        System.out.println("查询出来的记录:"+count);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs; 
        for(ScoreDoc scoreDoc:scoreDocs){
            //获取当前scoreDoc的id
            int docId = scoreDoc.doc;
            //通过document的id来获取每个Field域的值
            Document doc = search.doc(docId);
            System.out.println("文件名字:"+doc.get("fileName"));
            System.out.println("文件的内容:"+doc.get("context"));
        }
        reader.close();
    }

    public static void main(String[] args) throws Exception {
        doSearch();
    }

}

3删除和修改索引

package lucene;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

/**
 * 删除和修改
 */
public class UpdateIndexOnLocal {
    /**
     * 根据条件删除
     */
    public static void deleteIndex() throws Exception{
        //创建IndexWriter
        Analyzer analyzer = new StandardAnalyzer();
        File indexfile = new File("D:/decstop/index");
        Directory directorty = FSDirectory.open(indexfile);// cun chu
        IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        IndexWriter writer = new IndexWriter(directorty, cfg);
        //writer.deleteAll();    //工作中不要用,且用且珍惜
        //参数,域名     对应删除的值
        //删除时,最好根据document 中的唯一值
        writer.deleteDocuments(new Term("fileName", "text1"));
        writer.close();
    }

    /**
     * 修改索引
     */
    public static void updateIndex() throws Exception{
        //创建IndexWriter
        Analyzer analyzer = new StandardAnalyzer();
        File indexfile = new File("D:/decstop/index");
        Directory directorty = FSDirectory.open(indexfile);// cun chu
        IndexWriterConfig cfg = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        IndexWriter writer = new IndexWriter(directorty, cfg);

        //创建一个文档域,再创建一个File域进行更新
        Document doc = new Document();
        doc.add(new TextField("content", "abcdefghigk",Store.YES));
        //进行更新
        writer.updateDocument(new Term("fileName","text1"), doc);
        writer.close();

    }

    public static void main(String[] args) throws Exception {
        //deleteIndex();
        updateIndex();
    }

}

Lucene的搜索语法:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,基于Apache Lucene搜索库构建。它被广泛用于日志分析、全文检索、业务监控等场景。 在Java使用Elasticsearch可以通过Java API来操作。以下是一个简单的示例: 1. 在pom.xml文件中添加Elasticsearch依赖: ``` <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>7.9.2</version> </dependency> ``` 2. 创建Elasticsearch客户端: ``` RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); ``` 3. 创建索引: ``` CreateIndexRequest request = new CreateIndexRequest("my_index"); client.indices().create(request, RequestOptions.DEFAULT); ``` 4. 添加文档: ``` IndexRequest request = new IndexRequest("my_index"); request.id("1"); String jsonString = "{" + "\"name\":\"John\"," + "\"age\":30," + "\"city\":\"New York\"" + "}"; request.source(jsonString, XContentType.JSON); IndexResponse response = client.index(request, RequestOptions.DEFAULT); ``` 5. 搜索文档: ``` SearchRequest request = new SearchRequest("my_index"); SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("name", "John")); request.source(builder); SearchResponse response = client.search(request, RequestOptions.DEFAULT); ``` 这是一个简单的示例,实际使用中还可以使用更多的API来操作Elasticsearch。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值