Lucence_Curd

設置Field的類型

 

new StringField 不分詞(id,身份證號,電話...)

new StoredField 不分詞(鏈接)

new TextField 分詞(文本)

new FloadField 不分詞(數字,單價)

 

接著上篇文章    說說Lucene的怎刪改查操作

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

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class LuceneCRM {
    
    /**
     * 添加
     * @throws Exception
     */
    @Test
    public void add() throws Exception{
        //獲得文檔
        Document document = new Document();
        document.add(new StringField("id", "6", Store.YES));
        document.add(new TextField("Name", "柳巖",Store.YES));
        document.add(new StoredField("url", "www.baidu.com"));
        
        //獲得分析器
        Analyzer analyzer = new IKAnalyzer();
//        5. 創建Directory對象,聲明索引庫存儲位置
        Directory directory =  FSDirectory.open(new File("H:\\temp"));
//        4. 創建IndexWriterConfig配置信息類
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
//        6. 創建IndexWriter寫入對象
        IndexWriter indexWriter = new IndexWriter(directory, config);
        
        indexWriter.addDocument(document);
        indexWriter.close();
     }
    
    /**
     * 修改
     * 更新索引是先刪除再添加,建議對更新需求采用此方法并且要保證對已存在的索引執行更新,
     * 可以先查詢出來,確定更新記錄存在執行更新操作
     * 如果更新索引的目標文檔對象不存在,則執行添加。
     * @throws Exception 
     */
    @Test
    public void update() throws Exception{
        //獲得分析器
        Analyzer analyzer = new IKAnalyzer();
        // 創建搜索解析器,第一個參數:默認Field域,第二個參數:分詞器
        QueryParser queryParser = new QueryParser("name",analyzer);
        // 1. 創建Query搜索對象
        Query query = queryParser.parse("id:6");
        
//        5. 創建Directory對象,聲明索引庫存儲位置
        Directory directory =  FSDirectory.open(new File("H:\\temp"));
        
        // 3. 創建索引讀取對象IndexReader
        IndexReader indexReader = DirectoryReader.open(directory);
        
        // 4. 創建索引搜索對象IndexSearcher
        IndexSearcher searcher = new IndexSearcher(indexReader);
        
        // 5. 使用索引搜索對象,執行搜索,返回結果集TopDocs
        TopDocs topDocs = searcher.search(query, 1);
        System.out.println("查詢到的數據總條數是:" + topDocs.totalHits);
        
        
        
        //獲得結果集
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            //獲得文檔
            Document document = searcher.doc(scoreDoc.doc);
            //如果文檔存在就修改
            if(document!=null){
//                4. 創建IndexWriterConfig配置信息類
                IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
//                6. 創建IndexWriter寫入對象
                IndexWriter indexWriter = new IndexWriter(directory, config);
                
                Document document2 = new Document();
                //修改
                document2.add(new TextField("name", "劉亦菲4", Store.YES));
                document2.add(new TextField("Name", "柳巖4",Store.YES));
                /*document2.add(new StringField("id", document.getField("id").stringValue(), Store.YES));
                document2.add(new StoredField("url", document.getField("url").stringValue()));*/
                document2.add(document.getField("id"));
                document2.add(document.getField("url"));
                
                indexWriter.updateDocument(new Term("id", "6"), document2);
                indexWriter.close();
            }
        }
        
        indexReader.close();
        
    }
    
    
    /**
     * 這個沒有先做查詢直接修改的 
     * 符合的doc文檔>>這樣這里加幾個Field,修改的就是Field  其他的Field就不存在了
     * (比如原來5個Field)
     * @throws Exception
     */
    @Test
    public void testIndexUpdate() throws Exception {
        // 創建分詞器
        Analyzer analyzer = new IKAnalyzer();
        // 創建Directory流對象
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        // 創建寫入對象
        IndexWriter indexWriter = new IndexWriter(directory, config);

        // 創建Document
        Document document = new Document();
        document.add(new TextField("id", "1003", Store.YES));
        document.add(new TextField("Name", "lucene測試test 004", Store.YES));
        /*document.add(new TextField("desc", "啊哈哈哈哈哈哈哈",Store.YES));*/           //這里修改他會把這條數據給刪除了

        // 執行更新,會把所有符合條件的Document刪除,再新增。
        indexWriter.updateDocument(new Term("id", "1002"), document); //找到Field域為Name的中值為柳巖的所有的文檔

        // 釋放資源
        indexWriter.close();
    }

    
    
    /**
     * 刪除部分
     * @throws Exception 
     */
    @Test
    public void delete() throws Exception{
        //解析器
        Analyzer analyzer = new IKAnalyzer();
        //磁盤位置
        Directory directory = FSDirectory.open(new File("H:\\temp"));
//        4. 創建IndexWriterConfig配置信息類
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        //寫入對象
        IndexWriter indexWriter = new IndexWriter(directory,config );
        
        indexWriter.deleteDocuments(new Term("id","6"));
        
        indexWriter.close();
    }
    
    /**
     * 查詢  第一種方式
     * @throws Exception 
     */
    @Test
    public void find01() throws Exception{
        Analyzer analyzer = new IKAnalyzer();
        QueryParser parser = new QueryParser("name", analyzer);
        //parser.parse()
        Query query = parser.parse("Name:柳巖");
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader reader =  DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(reader);
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("Name"));
        }
        reader.close();
    }
    
    /**
     * 查詢  第二種方式
     * @throws Exception 
     */
    @Test
    public void find02() throws Exception{
        Query query = new TermQuery(new Term("Name","柳巖"));
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("Name"));
        }
        indexReader.close();
    }
    
    /**
     * 查詢 第三種方式
     * NumericRangeQuery,指定數字范圍查詢
     */
    @Test
    public void find03() throws Exception{
        Query query = NumericRangeQuery.newFloatRange("price",50f, 70f, false, true);//(50f,70f]
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("name"));
        }
        indexReader.close();
    }
    
    /**
     * 查詢 第四種方式
     * BooleanQuery,指定數字范圍查詢
     */
    @Test
    public void find04() throws Exception{
        Query query1 = new TermQuery(new Term("desc","java"));
        Query query2 = NumericRangeQuery.newFloatRange("price",50f, 70f, false, true);//(50f,70f]
        
        BooleanQuery booleanQuery  = new BooleanQuery();
        /**
         *   1、MUST和MUST表示“與”的關系,即“交集”。 
             2、MUST和MUST_NOT前者包含后者不包含。 
             3、MUST_NOT和MUST_NOT沒意義 
             4、SHOULD與MUST表示MUST,SHOULD失去意義; 
             5、SHOULD與MUST_NOT相當于MUST與MUST_NOT。 
             6、SHOULD與SHOULD表示“或”的關系,即“并集”。

         */
        booleanQuery.add(query1, Occur.MUST);
        booleanQuery.add(query2, Occur.MUST);
        
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        TopDocs topDocs = indexSearcher.search(booleanQuery, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("name"));
        }
        indexReader.close();
    }
    
    /**
     * 組合查詢
     */
    @Test
    public void find05() throws Exception{
        Analyzer analyzer = new IKAnalyzer();
        QueryParser queryParser = new QueryParser("desc", analyzer);
        //QueryParser提供一個Parse方法,此方法可以直接根據查詢語法來查詢
        //它支持字符串范圍。數字范圍搜索建議使用NumericRangeQuery
        Query query = queryParser.parse("desc:java AND lucene");
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("name"));
        }
        indexReader.close();
    }
    
    /**
     * 通過MultiFieldQueryParse對多個域查詢。
     */
    @Test
    public void find06() throws Exception{
        Analyzer analyzer = new IKAnalyzer();
        MultiFieldQueryParser multiFieldQueryParser = new MultiFieldQueryParser(new String[]{"name","desc"}, analyzer);
        //通過MultiFieldQueryParse對多個域查詢
        //搜索這兩個域中包含lucene域
        Query query = multiFieldQueryParser.parse("lucene");  //name:lucene desc:lucene
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexReader indexReader = DirectoryReader.open(directory);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        TopDocs topDocs = indexSearcher.search(query, 10);
        ScoreDoc[] docs = topDocs.scoreDocs;
        for (ScoreDoc scoreDoc : docs) {
            Document document = indexSearcher.doc(scoreDoc.doc);
            System.out.println(document.get("name"));
        }
        indexReader.close();
    }
    
    /**
     * 相關度排序(boost是一個加權值(默認加權值為1.0f))
     * Lucene對查詢關鍵字和索引文檔的相關度進行打分,得分高的就排在前邊
     *     1)計算出詞(Term)的權重   
        2)根據詞的權重值,計算文檔相關度得分。
        ?    Term Frequency (tf):
                指此Term在此文檔中出現了多少次。tf 越大說明越重要。 
                詞(Term)在文檔中出現的次數越多,說明此詞(Term)對該文檔越重要,如“Lucene”這個詞,
                在文檔中出現的次數很多,說明該文檔主要就是講Lucene技術的。
?            Document Frequency (df):
                指有多少文檔包含此Term。df 越大說明越不重要。     
                比如,在一篇英語文檔中,this出現的次數更多,就說明越重要嗎?
                不是的,有越多的文檔包含此詞(Term), 說明此詞(Term)太普通,不足以區分這些文檔,因而重要性越低。
     * @throws Exception 
     */
    @Test
    public void addS() throws Exception{
        Analyzer analyzer = new IKAnalyzer();
        Directory directory = FSDirectory.open(new File("H:\\temp"));
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
        IndexWriter indexWriter = new IndexWriter(directory, config);
        
        Document document = new Document();
        document.add(new StringField("id", "7", Store.YES));
        document.add(new TextField("desc", "哈哈哈哈哈哈", Store.YES));
        document.add(new TextField("name", "柳巖", Store.YES));
        //添加權重   
        TextField field = new TextField("Name", "柳巖", Store.YES);  //在做查詢柳巖是  這個就排在第一個了  無敵了
        field.setBoost(100f);  //設置權重
        document.add(field);
        
        indexWriter.addDocument(document);
        
        indexWriter.close();
    }
    
}

說說我對權重的解釋,這個經常baidu的人很有感觸,一些廣告總是出現在最前面,個人覺得就是(你懂得,調整了權重...哈哈)


來源:學UI網

上一篇: 設計模式之創建者模式

下一篇: JMS 之 Active MQ 啟動嵌入式Broke

分享到: 更多
重庆时时官网开奖同步 3分快3稳赚技巧 抢庄牛牛下载 鑫宝国娱乐pt游戏平台 北京pk赛车开奖历史 一分快三玩法技巧规律 体探足球即时比分 重庆时时彩开奖记录 时时彩双面盘网站 打老虎机有什么技巧吗 三期必開一期永久 飞艇计划九码 1908手机通比牛牛 藏分出款是什么意思 二八杠技巧口诀论坛 黑龙江时时彩走势图