Lucene CRUD

lucene官網:http://lucene.apache.org/

引入maven:

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    <version>8.2.0</version>
</dependency>

1、創建索引

 @Test
 public void testCreate() throws Exception {
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        Analyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        IndexWriter indexWriter = new IndexWriter(directory, config);

        File file = new File("/Users/raoleilei/Downloads/jar");
        File[] listFiles = file.listFiles();
        for (File file1 : listFiles) {
            Document document = new Document();
            String fileName = file1.getName();
            Field fieldName = new TextField("fileName", fileName, Field.Store.YES);
            String filePath = file1.getPath();
            Field fieldPath = new StoredField("filePath", filePath);

            document.add(fieldName);
            document.add(fieldPath);
            indexWriter.addDocument(document);
        }
        indexWriter.close();
}

索引文件的查看:luke,https://github.com/DmitryKey/luke

2、刪除索引

@Test
public void testDelete()throws Exception{
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        Analyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
        IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
        Query query = new TermQuery(new Term("fileName","java"));
        Query query1 = new TermQuery(new Term("fileName","jar"));
        indexWriter.deleteDocuments(query,query1);
        indexWriter.close();
}

3、修改索引

@Test
public void testUpdate()throws Exception{
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        Analyzer analyzer = new StandardAnalyzer();
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);
        IndexWriter indexWriter = new IndexWriter(directory,indexWriterConfig);
        Document document = new Document();
        document.add(new TextField("fileA","你好",Field.Store.YES));
        document.add(new TextField("fileB","世界",Field.Store.YES));
        indexWriter.updateDocument(new Term("fileName","jenkins.war"),document);
        indexWriter.close();
}

4、查詢索引

    搜索使用的分詞器要和索引使用的分詞器一致。

<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>8.2.0</version>
</dependency>
@Test
public void testQuery() throws Exception {
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        Query query = new TermQuery(new Term("fileName", "jar"));
        System.err.println(query);
        TopDocs topDocs = indexSearcher.search(query, 2);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : scoreDocs) {
            int doc = scoreDoc.doc;
            Document document = indexSearcher.doc(doc);
            System.err.println(document.get("fileName"));
            System.err.println(document.get("filePath"));
        }
        indexReader.close();
}

@Test
public void testQueryAll() throws Exception {
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        Query query = new MatchAllDocsQuery();
        System.err.println(query);
        print(indexSearcher, query);
        indexReader.close();
}

@Test
public void test1() throws Exception {
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);

        QueryParser queryParser = new QueryParser("fileName", new StandardAnalyzer());
        Query query = queryParser.parse("fileName:java AND fileName:8.0.13");
        System.err.println(query);

        print(indexSearcher, query);
        indexReader.close();
}

@Test
public void test2() throws Exception {
        Directory directory = FSDirectory.open(new File("/usr/data/lucene/index").toPath());
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);


        String[] filed = {"fileName", ""};
        MultiFieldQueryParser queryParser = new MultiFieldQueryParser(filed, new StandardAnalyzer());
        Query query = queryParser.parse("fileName:java AND fileName:8.0.13");
        System.err.println(query);

        print(indexSearcher, query);
        indexReader.close();
    }

public void print(IndexSearcher indexSearcher, Query query) throws Exception {
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : scoreDocs) {
            int doc = scoreDoc.doc;
            Document document = indexSearcher.doc(doc);
            System.err.println(document.get("fileName"));
            System.err.println(document.get("filePath"));
        }
}

QueryParser 語法

1、基礎的查詢語法,關鍵字查詢:

    域名+“:”+搜索的關鍵字,例如:fileName:java

2、範圍查詢:

    域名+“:”+[最大值 TO 最小值],例如:size:[1 TO 100]

    範圍查詢在lucene中支持數值類型,不支持字符串類型,在solr中支持字符串類型

3、組合條件查詢

    必須滿足    +(AND)

    可選    空格(OR)

    不能滿足    -(NOT)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章