3愿题、對(duì)日期和數(shù)字添加索引(lucene筆記)

這里我們拷貝之前的工程(lucene_index01)為工程lucene_index02损俭。然后在創(chuàng)建索引和搜索方法上進(jìn)行改進(jìn)測(cè)試。
相關(guān)代碼:
IndexUtil.java

package cn.lucene.index;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Fieldable;
import org.apache.lucene.document.NumericField;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.FieldInfo.IndexOptions;
import org.apache.lucene.index.StaleReaderException;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
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.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

public class IndexUtil {
    private String[] ids = {"1", "2", "3", "4", "5", "6"};
    //下面是郵件
    private String[] emails = {"aa@qq.com", "bb@sina.edu", "cc@yahu.org", "ss@sina.com", "dd@gmail.com", "ee@163.com"};
    //下面是郵件內(nèi)容
    private String[] content = {
            "welcom to visited the space,I like football", 
            "hello boy, i like someone", 
            "come on baby", 
            "first blood", 
            "I like football,I like football", 
            "my girlfriend is so beatiful, every body like game"
    };
    private int[] attaches = {2,5,6,5,8,4};//附件數(shù)量
    //發(fā)件人名字
    private String[] names = {"Tom", "Jack", "goudan", "alibaba", "jerry", "kitty"};
    //郵件的日期
    private Date[] dates = null;
    
    private Directory directory = null;
    private Map<String, Float> scores = new HashMap<String, Float>();//新建一個(gè)Map潘酗,用來存儲(chǔ)權(quán)值
    
    public IndexUtil() {
        try {
            setDates();//設(shè)置日期
            scores.put("qq.com", 2.0f);//如果是"qq.com"結(jié)尾的索引則讓其權(quán)值為2.0杆兵,注意:默認(rèn)是1.0
            scores.put("sina.edu", 1.5f);
            directory = FSDirectory.open(new File("E:/myeclipse/Lucene/index"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //創(chuàng)建索引
    public void index(){
        IndexWriter writer = null;
        try {
            writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
            //此方法可將索引全部清空
            writer.deleteAll();
            Document document = null;
            for(int i = 0; i < ids.length; i++){
                document = new Document();
                //id需要存儲(chǔ),不需要加權(quán)仔夺、分詞琐脏,email也需要存儲(chǔ),但不需要分詞囚灼,有時(shí)候也需要加權(quán)
                //對(duì)于內(nèi)容骆膝,我們不需要存儲(chǔ)和加權(quán)祭衩,但需要分詞。而名字需要存儲(chǔ)阅签,不需要分詞和加權(quán)
                //這里我們先不對(duì)整型數(shù)據(jù)進(jìn)行索引掐暮,后面再說
                document.add(new Field("id", ids[i], Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
                document.add(new Field("email", emails[i], Field.Store.YES, Field.Index.NOT_ANALYZED));
                document.add(new Field("content", content[i], Field.Store.NO, Field.Index.ANALYZED));
                document.add(new Field("name", names[i], Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
                
                //為數(shù)字添加索引,第三個(gè)參數(shù)設(shè)置為true表示默認(rèn)索引
                document.add(new NumericField("attach", Field.Store.YES, true).setIntValue(attaches[i]));
                //為日期添加索引
                document.add(new NumericField("date", Field.Store.YES, true).setLongValue(dates[i].getTime()));
                
                
                String et = emails[i].substring(emails[i].lastIndexOf("@") + 1);
                System.out.println(et);
                //加入權(quán)值
                if(scores.containsKey(et)){
                    document.setBoost(scores.get(et));
                }else{
                    document.setBoost(0.5f);
                }
                writer.addDocument(document);
            }
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (LockObtainFailedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(writer != null){
                try {
                    writer.close();
                } catch (CorruptIndexException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //設(shè)置日期
    private void setDates(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            dates = new Date[ids.length];
            dates[0] = sdf.parse("2015-02-15");
            dates[1] = sdf.parse("2015-03-01");
            dates[2] = sdf.parse("2015-05-18");
            dates[3] = sdf.parse("2015-09-05");
            dates[4] = sdf.parse("2015-12-15");
            dates[5] = sdf.parse("2015-08-29");
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    public void search(){
        IndexReader reader;
        try {
            reader = IndexReader.open(directory);
            IndexSearcher searcher = new IndexSearcher(reader);
            TermQuery query = new TermQuery(new Term("content", "like"));//搜索內(nèi)容中含有l(wèi)ike的
            TopDocs tds = searcher.search(query, 10);
            for(ScoreDoc sd : tds.scoreDocs){
                Document doc = searcher.doc(sd.doc);
                //這里我們獲取權(quán)值getBoost()的時(shí)候發(fā)現(xiàn)都是1.0政钟,這是因?yàn)檫@里是獲取的一個(gè)document路克,和原來的沒有關(guān)系。
                //要想看其權(quán)值信息养交,可以使用luke工具
                //而這里的日期需要我們轉(zhuǎn)換成日期格式
                System.out.println("(" + sd.doc + "權(quán)值:"+ doc.getBoost() + ")" + doc.get("name") + "[" + doc.get("email") + "]-->" 
                            + doc.get("id") + "-->" + doc.get("attach") + "-->" + doc.get("date"));
                reader.close();
            }
        } catch (CorruptIndexException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

說明:

  • 這里我們首先加入日期精算,同時(shí)使用
//為數(shù)字添加索引,第三個(gè)參數(shù)設(shè)置為true表示默認(rèn)索引
document.add(new NumericField("attach", Field.Store.YES, true).setIntValue(attaches[i]));
//為日期添加索引
document.add(new NumericField("date", Field.Store.YES, true).setLongValue(dates[i].getTime()));

為數(shù)字和日期加入索引碎连。

  • 這里要注意的是我們要想查看索引的權(quán)值不能使用getBoost方法灰羽,不然查出來的權(quán)值都是1.0,可以使用luke工具查看鱼辙。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廉嚼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子倒戏,更是在濱河造成了極大的恐慌怠噪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜跷,死亡現(xiàn)場(chǎng)離奇詭異傍念,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葛闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門憋槐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人孵运,你說我怎么就攤上這事秦陋。” “怎么了治笨?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵驳概,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我旷赖,道長(zhǎng)顺又,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任等孵,我火速辦了婚禮稚照,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己果录,他們只是感情好上枕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著弱恒,像睡著了一般辨萍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上返弹,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天锈玉,我揣著相機(jī)與錄音,去河邊找鬼义起。 笑死拉背,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的默终。 我是一名探鬼主播椅棺,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼穷蛹!你這毒婦竟也來了土陪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤肴熏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顷窒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛙吏,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年鞋吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸦做。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谓着,死狀恐怖泼诱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赊锚,我是刑警寧澤治筒,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站舷蒲,受9級(jí)特大地震影響耸袜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牲平,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一堤框、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦蜈抓、人聲如沸启绰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)酬土。三九已至,卻和暖如春格带,著一層夾襖步出監(jiān)牢的瞬間撤缴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工叽唱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈呕,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓棺亭,卻偏偏與公主長(zhǎng)得像虎眨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子镶摘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 構(gòu)建索引過程 文檔是Lucene索引和被搜索的最小單位嗽桩,一個(gè)文檔包含一個(gè)或者多個(gè)域,而域則包含了真正 被搜索 的內(nèi)...
    RagPanda閱讀 3,481評(píng)論 0 2
  • 目錄結(jié)構(gòu):1.全文檢索 2.Lucene入門3.Lucene進(jìn)階 全文檢索 一, 生活中的搜索:1.Win...
    CoderZS閱讀 1,677評(píng)論 0 12
  • 也是項(xiàng)目需要用的框架之一扑庞,為了不讓自己輕易忘記它,在此記錄一系列的lucene學(xué)習(xí)筆記(基于lucene4.4拒逮,I...
    JackFrost_fuzhu閱讀 2,004評(píng)論 4 27
  • 火車倒著走 思念的有效期限 快到了 風(fēng)來了罐氨,我努力揮動(dòng)著手 你好嗎 是從家鄉(xiāng)跑過來的吧 穿梭,停歇 我長(zhǎng)著雙臂卻不...
    李大俠_閱讀 154評(píng)論 7 5
  • 小時(shí)候滩援, 吮著一顆糖果栅隐, 連空氣都是甜的, 那時(shí)的天空那么藍(lán)玩徊, 太陽(yáng)那么暖租悄, 長(zhǎng)大后, 即使深吮糖果佣赖, 也未必融化...
    洛熙_閱讀 260評(píng)論 0 0