天天看點

Lucene 常用filed 使用 與索引庫維護

    StringField      N                      Y               N or Y                  比如:手機号、身份證号

    LongField       Y                      Y               N or Y                   比如:商品的價格、檔案大小

    StoredField     N                      N               Y                          比如:網頁位址URL、檔案路徑

    TextFiled         Y                      Y               N or Y                   比如:網頁内容、檔案内容   

      Field類 資料類型

Analyzed

是否分析

Indexed

是否索引

Stored

是否存儲

說明
     StringField(FieldName,                  FieldValue,Store.YES)) 字元串 N Y Y或N

這個Field用來建構一個字元串Field,但是不會進行分析,會将整個串存儲在索引中,比如(訂單号,姓名等)

是否存儲在文檔中用Store.YES或Store.NO決定

     LongPoint(String name, long...        point) Long型 Y Y N 可以使用LongPoint、IntPoint等類型存儲數值類型的資料。讓數值類型可以進行索引。但是不能存儲資料,如果想存儲資料還需要使用StoredField。
     StoredField(FieldName,                  FieldValue)  重載方法,支援多種類型 N N Y

這個Field用來建構不同類型Field

不分析,不索引,但要Field存儲在文檔中

       TextField(FieldName,                      FieldValue, Store.NO)

     或

     TextField(FieldName, reader)

字元串

Y Y Y或N 如果是一個Reader, lucene猜測内容比較多,會采用Unstored的政策.

使用  LongPoint

   對檔案大小的 範圍 索引

private IndexReader indexReader;
    private IndexSearcher indexSearcher;
    @Before
    public void init() throws Exception {
        indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源碼\\Lucene\\indexlib").toPath()));
        indexSearcher = new IndexSearcher(indexReader);

    }

    @Test
    public void testRangeQuery() throws Exception{
        Query query = LongPoint.newRangeQuery("size", 10L, 100L);    long類型的 10 到100
        TopDocs topDocs = indexSearcher.search(query, 10);
        System.out.println("總記錄數:" + topDocs.totalHits);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc doc:scoreDocs){
            //取文檔id
            int docId = doc.doc;
            //根據id取文檔對象
            Document document = indexSearcher.doc(docId);
            System.out.println(document.get("name"));
            System.out.println(document.get("path"));
            System.out.println(document.get("size"));    建立時使用了 StoredField 才能取出
            //System.out.println(document.get("content"));
            System.out.println("-----------------寂寞的分割線");
        }
        indexReader.close();
    }
           

   注意不存儲  不代表不能被索引  隻是不能取出這個文檔的 的域的值

增删改

public class IndexManager {
    private IndexWriter indexWriter;

    @Before
    public void init() throws Exception{
        indexWriter=new IndexWriter(FSDirectory.open(new File("D:\\java\\Java源碼\\Lucene\\indexlib").toPath()),
                new IndexWriterConfig(new IKAnalyzer()));
    }
    
    添加新的文檔
    @Test
    public void testAddDocument() throws Exception{
        //建立一個Document對象
        Document document = new Document();
        //向document對象中添加域
        document.add(new TextField("name", "新添加的檔案", Field.Store.YES));
        document.add(new TextField("content", "新添加的檔案内容", Field.Store.NO));
        document.add(new StoredField("path", "c:/temp/helo"));
        // 把文檔寫入索引庫
        indexWriter.addDocument(document);
        //關閉索引庫
        indexWriter.close();
    }


    删除全部文檔
    @Test
    public void deleteAllDocument() throws Exception {
        indexWriter.deleteAll();
        indexWriter.close();
    }

    /**
     * 删除域中包含指定關鍵字的文檔
     * @throws Exception
     */
    @Test
    public void deleteDocumentByQuery() throws Exception {
        indexWriter.deleteDocuments(new Term("name", "apache"));
        indexWriter.close();
    }

    /**
     * 更新 域為name 包含關鍵字spring 的文檔,即先删除 再添加
     * @throws Exception
     */
    @Test
    public void updateDocument() throws Exception {
        //建立一個新的文檔對象
        Document document = new Document();
        //向文檔對象中添加域
        document.add(new TextField("name", "更新之後的文檔", Field.Store.YES));
        document.add(new TextField("name1", "更新之後的文檔2", Field.Store.YES));
        document.add(new TextField("name2", "更新之後的文檔3", Field.Store.YES));
        //更新操作
        indexWriter.updateDocument(new Term("name", "spring"), document);
        //關閉索引庫
        indexWriter.close();
    }
}
           

查詢文法

    1) TermQuery   文法:   name:apache

     2)、MatchAllDocsQuery  文法: *:*

     3)、NumericRangeQuery  文法:  size:[100 TO 1000] 但是luke不支援數值的範圍查詢   solr支援的

   支援複合查詢

     Query query = new BooleanQuery( )

     Query query1 = new TermQuery(new Term("name", "apache"));

     Query query2 = new TermQuery(new Term("content", "spring"));

     query.add(query1, Occur.MUST);

     query.add(query2, Occur.MUST);  文法:  +name:apache +content:spring          and 

     query.add(query1, Occur.MUST);

     query.add(query2, Occur.SHOULD);文法:  +name:apache content:spring            or

      query.add(query1, Occur.MUST);

      query.add(query2, Occur.MUST_NOT); 文法: +name:apache -content:spring

      query.add(query1, Occur.MUST_NOT);

      query.add(query2, Occur.MUST_NOT);  此查詢無意義

Queryparser

    1.當需要對 索引的關鍵字進行分詞 再查找索引時使用      列如百度輸入輸入一句話進行搜尋       需要jar包:

lucene-queryparser-7.4.0.jar
           

  2.查詢content域中    包含對  這句 "lucene是一個Java開發的全文檢索工具包" 話分詞後的關鍵字的文檔對象

public class parseQurey {

    private IndexReader indexReader;
    private IndexSearcher indexSearcher;

    @Before
    public void init() throws Exception{
        indexReader= DirectoryReader.open(FSDirectory.open(new File("D:\\java\\Java源碼\\Lucene\\indexlib").toPath()));
        indexSearcher = new IndexSearcher(indexReader);
    }

    @Test
    public void testQueryParser() throws Exception {
        //建立一個QueryPaser對象,兩個參數
        QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
        //參數1:預設搜尋域,參數2:分析器對象
        //使用QueryPaser對象建立一個Query對象
        Query query = queryParser.parse("lucene是一個Java開發的全文檢索工具包");
        //執行查詢
        TopDocs topDocs = indexSearcher.search(query, 10);
        System.out.println("總記錄數:" + topDocs.totalHits);
        ScoreDoc[] scoreDocs = topDocs.scoreDocs;
        for (ScoreDoc doc:scoreDocs){
            //取文檔id
            int docId = doc.doc;
            //根據id取文檔對象
            Document document = indexSearcher.doc(docId);
            System.out.println(document.get("name"));
            System.out.println(document.get("path"));
            System.out.println(document.get("size"));
            //System.out.println(document.get("content"));
            System.out.println("-----------------寂寞的分割線");
        }
        indexReader.close();
}}
           

查詢結果排序

三、相關度排序(競價排序)

    name:apache

        apache lucene.txt

        Apache_Lucene_README.txt

        Welcome to the Apache Solr project.txt                按比重排序 

    打分:預設分值是1,設定越高排名靠前

    Field.setBoost(分數);

繼續閱讀