<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 30,  comments - 85,  trackbacks - 0

    Lucene 的學(xué)習(xí)

    ?????? 通過(guò)這幾天的看書(shū)和學(xué)習(xí),對(duì) Lucene 有了更進(jìn)一步的認(rèn)識(shí),所以總結(jié)一下這些天的學(xué)習(xí)成果把 Lucene 的學(xué)習(xí)心得也學(xué)出來(lái)。

    1????????? Lucene 的認(rèn)識(shí)

    提到 Lucene 很多人都知道這個(gè)開(kāi)源的搜索工具,其魅力也是很大的。它讓我們對(duì)搜索引擎的認(rèn)識(shí)不在那么神秘,也不會(huì)在覺(jué)得百度和 google 的技術(shù)多么的高深沒(méi)測(cè),其實(shí)其原理都是一樣的,只是他們要做的更好,走的更遠(yuǎn)罷了。

    Lucene 可以對(duì)任何的數(shù)據(jù)做索引和搜索,說(shuō)這樣的話其實(shí)不過(guò)分,真的就是這樣,只要你能處理好這些數(shù)據(jù),交給 Lucene 去建立索引它都可以幫你把這些數(shù)據(jù)給檢索出來(lái),是不是很好玩了。真正好玩的地方還在后面呢。

    2????????? Lucene 的學(xué)習(xí)

    前面已經(jīng)對(duì) Lucene 有了一些了解,現(xiàn)在我們想象它怎么去搜索這些數(shù)據(jù)呢,如果知道倒排索引,你就知道了,其實(shí) lucene 檢索的是它自己建立的索引,從索引中的到數(shù)據(jù)的指針,從而得到數(shù)據(jù)。其實(shí)就這么簡(jiǎn)單。

    提到索引,現(xiàn)在的索引技術(shù)中有:倒排索引、后綴數(shù)組和簽名文件這三種,其中后綴數(shù)組這種技術(shù)雖然檢索速度也很快,但是它的數(shù)據(jù)結(jié)構(gòu)構(gòu)造和維護(hù)都是相當(dāng)麻煩的所以不可取了。我也懶得去看了。至于簽名文件嘛,那是 80 年代的玩意了,現(xiàn)在已經(jīng)過(guò)時(shí)了。現(xiàn)在可是倒排索引的天下啊!相信百度和 google 都是這種技術(shù)。

    3????????? 索引的建立

    ?

    我們從索引的建立入手:

    我們建立一個(gè) lucene 的索引時(shí)必須先建立該索引文件存放的位置,看一下代碼:

    IndexWriter writer = null;

    writer = new IndexWriter("c:\\index", new CJKAnalyzer(), true);

    這段代碼就時(shí)建立一個(gè)索引前所必須的操作,先聲明這個(gè) IndexWriter ,實(shí)例化它你必須傳入三個(gè)參數(shù)。他們分別代表:你要建立索引文件的存放位置、你要使用索引建立的分詞方法、是否重新建立索引。這樣你就告訴 lucene 我要在 c 盤(pán)的 index 目錄下建立索引文件,我要使用車東老師的二分詞算法做分析器、我要在這個(gè)目錄下刪除以前的索引或任何文件創(chuàng)立我的索引文件。

    索引的建立有三種方式,讓我一一道來(lái):

    1 new IndexWriter(new RAMDirectory(), new StandardAnalyzer(), true);

    在內(nèi)存中建立索引,速度最快但是耗資源,而且重啟就沒(méi)了。

    2 new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);

    在文件系統(tǒng)中建立索引,這里有兩個(gè)參數(shù),分別是:建立索引的路徑、是否要?jiǎng)h除當(dāng)前目錄下的文件重新建立索引。

    3 new IndexWriter("c:\\index", new CJKAnalyzer(), true);

    最常見(jiàn)的一種,在制定目錄下建立索引,看了源碼你就知道這種方法也是用的第二種方式。 Lucene 的源碼:

    public IndexWriter(String path, Analyzer a, boolean create)

    ?????? throws IOException {

    ?this(FSDirectory.getDirectory(path, create), a, create, true);

    ? }

    我想的沒(méi)錯(cuò)。

    Indexwriter 性能調(diào)整參數(shù):

    第一個(gè)優(yōu)化的參數(shù) mergeFactor 這個(gè)參數(shù)用于控制 lucene 在把索引從內(nèi)存寫(xiě)入到磁盤(pán)上的文件系統(tǒng)時(shí)內(nèi)存最大的 Document 對(duì)象的數(shù)量。這個(gè)數(shù)要根據(jù)你的計(jì)算機(jī)設(shè)置,默認(rèn)情況下是 10

    ??? 第二個(gè)優(yōu)化的參數(shù) maxMergeFactor 這個(gè)參數(shù)用來(lái)設(shè)置當(dāng)有多少個(gè) Segment 時(shí)進(jìn)行合并操作。當(dāng)然我們知道當(dāng)索引文件太多的話其檢索的速度就會(huì)很慢,所以我們要當(dāng)文件數(shù)量一定時(shí)讓它進(jìn)行索引的合并。這樣就可以加快索引速度,但是這個(gè)值要根據(jù)你的情況而定。當(dāng)文檔數(shù)量較多時(shí)我們將值設(shè)大些,當(dāng)文檔數(shù)量較少時(shí)我們將值設(shè)小些。

    第三個(gè)優(yōu)化的參數(shù) minMergeDocs 這個(gè)參數(shù)用于控制內(nèi)存中文檔的數(shù)量。

    ?

    這樣我們建立索引已經(jīng)完成,接下來(lái)我們要建立 Document 對(duì)象,因?yàn)槟惚仨毟嬖V我要搜索什么吧!好了,看看源碼:

    File file = new File("1.txt");

    Document doc = new Document();

    doc.add(Field.UnIndexed("filename", file.getName()));

    FileInputStream fis = new FileInputStream(file);

    byte[] b = new byte[fis.available()];

    fis.read(b);

    String content = new String(b);

    doc.add(Field.Text("content", content));

    fis.close();

    以上我們就完成了將 1.txt 文件放到我們的 Document 對(duì)象了。這里我們用了 Field.Text(); 這樣的操作和 doc.add(); 這樣的方法建立的。這也是建立索引的必須。

    稍微介紹一下 Field ,它就是你要建立索引的字段。它分別有

    類型 / 方法

    是否分詞

    是否索引

    是否存儲(chǔ)

    常用實(shí)例

    Keyword(String,String)

    Keyword(String,Date)

    電話號(hào)碼,身份證,人名,地名,日期

    Unindexed(String,String)

    文檔類型,文檔名稱

    UnStored(String,String)

    文檔的標(biāo)題和內(nèi)容

    Text(String,String)

    文檔的標(biāo)題和內(nèi)容

    Text(String,Reader)

    文檔的標(biāo)題和內(nèi)容

    ??? 這樣我們要建什么樣的索引就對(duì)號(hào)入座吧,只要最后我們使用 doc.add(Field.Text("content", content)); 把它添加到 Document 中就可以了。

    ??? 這時(shí)我們的文檔已經(jīng)建立好了,現(xiàn)在就開(kāi)始向索引中添加文檔吧!這里我們使用

    writer.addDocument(doc); 來(lái)向 Indexwriter 索引中添加構(gòu)造好的文檔。

    這樣我們是不是就可以說(shuō)我們已經(jīng)建立完了索引呢,其實(shí)不然,我們還要優(yōu)化優(yōu)化,這樣才快嘛!對(duì)不對(duì)?

    ??? writer.optimize(); 這樣一句話就可以實(shí)現(xiàn)索引優(yōu)化了,具體的優(yōu)化過(guò)程我就不說(shuō)了,是不是很簡(jiǎn)單。但是一定不要忘了哦。調(diào)用這個(gè)方法時(shí)最好建立一個(gè)合適的周期。定期進(jìn)行優(yōu)化。

    ??? 好了,這樣我們就完成了索引的建立了。

    ??? 下面我們看看縮影的合并吧!

    當(dāng)我們?cè)诤芏嗟胤浇⒘撕芏嗟乃饕螅胍喜⑦@些索引我們?cè)趺崔k呢?

    ??? 使用 IndexWriter.assIndexs(New Directory[]{path});

    就可以對(duì) path 路徑下的索引合并到當(dāng)前的索引中了。

    ??? 下面再看看索引的刪除吧!

    ??? 有一些過(guò)時(shí)的索引我們需要?jiǎng)h除,怎么辦呢?

    IndexReader reader = IndexReader.open("c:\\index");

    ??? reader.delete(0);

    這樣我們就可以按照文檔的順序刪除對(duì)應(yīng)的文檔了,但是這樣不太現(xiàn)實(shí),不對(duì)嗎?我們?cè)趺磿?huì)知道文檔的順序呢?

    下面我們看看第二中方法:

    IndexReader reader = IndexReader.open("c:\\index");

    reader.delete(new Term("name","word1"));

    reader.close();

    按照字段來(lái)刪除對(duì)應(yīng)的文檔,這樣合理多了。以后要?jiǎng)h除時(shí)就按照詞條的方式去刪除吧 !

    索引鎖: write.lock , commit.lock.

    write.lock 是為了避免幾個(gè)線程同時(shí)修改一個(gè)索引文檔而設(shè)置。當(dāng)實(shí)例一個(gè) indexwrite 時(shí)建立和使用 indexReader 刪除文檔時(shí)建立。

    Commit.lock 該鎖主要在 segment 在建立,合并或讀取時(shí)生成。

    4????????? Lucene 的搜索

    ?

    以上完成了索引的建立和一些關(guān)于索引的知識(shí),但是光有索引是不行的,我們真正要做的檢索,這才是我們的關(guān)鍵。現(xiàn)在我們看看 lucene 的檢索吧。

    認(rèn)識(shí)檢索從檢索的工具開(kāi)始吧! IndexSearcher 類是 lucene 用于檢索的工具類,我們?cè)跈z索之前要得到這個(gè)類的實(shí)例。

    第一步我們看以下代碼:

    IndexSearcher searcher = new IndexSearcher("c:\\index");

    創(chuàng)建 IndexSearcher 實(shí)例需要告訴 lucene 索引的位置,就是你 IndexWrite 的文件路徑。

    Query query = null;

    Hits hits = null;

    query = QueryParser.parse(key1, "name", new StandardAnalyzer());

    hits = searcher.search(query);

    if (hits != null) {

    ?????????? if (hits.length() == 0) {

    ????????????? System.out.println(" 沒(méi)有找到任何結(jié)果 ");

    ?????????? } else {

    ????????????? System.out.print(" 找到 ");

    ????????????? for (int i = 0; i < hits.length(); i++) {

    ????????????????? Document d = hits.doc(i);

    ????????????????? String dname = d.get("title");

    ????????????????? System.out.print(dname + "?? " );

    ????????????? }

    ?????????? }

    ?????? }

    }

    以上就是一個(gè)完整的檢索過(guò)程,這里我們看見(jiàn)了個(gè) Query Hits ,這兩個(gè)類就是比較關(guān)鍵的了,我們先從檢索結(jié)果的 Hits 類說(shuō)起。

    我們使用 Hits 經(jīng)常使用的幾個(gè)方法有:

    length() :? 返回搜索結(jié)果的總數(shù)量。

    Doc(int n) : 放回第 n 個(gè)文檔。

    Id(int n) : 返回第 n 個(gè)文檔的內(nèi)部編號(hào)。

    Sorce(int n) : 返回第 n 個(gè)文檔的得分。

    看見(jiàn)這個(gè) Sorce(int n) 這個(gè)方法,是不是就可以聯(lián)想到搜索引擎的排序問(wèn)題呢,像百度的推廣是怎么做出來(lái)的呢 , 可想而知吧,那就說(shuō)明必定存在一中方法可以動(dòng)態(tài)的改變某片文檔的得分。對(duì)了, lucene 中可以使用 Document setBoost 方法可以改變當(dāng)前文檔的 boost 因子。

    下面我們看看:

    Document doc1 = new Document();

    doc1.add(Field.Text("contents", "word1 word"));

    doc1.add(Field.Keyword("path", "path\\document1.txt"));

    ?doc1.setBoost(1.0f);

    ?

    ? 這樣我們就在改變了篇文檔的評(píng)分了,當(dāng) boost 的值越大它的分值就越高,其出現(xiàn)的位置就越靠前。

    讓我們?cè)賮?lái)看看 lucene 為我們提供的各種 Query 吧。

    第一、?? 按詞條搜索 TermQuery
    query = new TermQuery(new Term("name","word1"));

    hits = searcher.search(query);

    這樣就可以把 field name 的所有包含 word1 的文檔檢索出來(lái)了。

    第二、? “與或”搜索 BooleanQuery

    它實(shí)際是一個(gè)組合 query 看看下面的代碼:

    query1 = new TermQuery(new Term("name","word1"));

    query2 = new TermQuery(new Term("name","word2"));

    query = new BooleanQuery();

    query.add(query1, false, false);

    query.add(query2, false, false);

    hits = searcher.search(query);

    看看 booleanQuery 的用法吧:

    true & true : 表明當(dāng)前加入的字句是必須要滿足的。相當(dāng)于邏輯與。

    false & true : 表明當(dāng)前加入的字句是不可一被滿足的, 相當(dāng)于邏輯非。

    false & false : 表明當(dāng)前加入的字句是可選的,相當(dāng)于邏輯或。

    true & true : 錯(cuò)誤的情況。

    Lucene 可以最多支持連續(xù) 1024 query 的組合。

    第三、? 在某一范圍內(nèi)搜索 RangeQuery

    IndexSearcher searcher = new IndexSearcher("c:\\index");

    ???? Term beginTime = new Term("time","200001");

    ???? Term endTime = new Term("time","200005");

    ???? Hits hits = null;

    ???? RangeQuery query = null;

    ???? query = new RangeQuery(beginTime, endTime, false);

    ???? hits = searcher.search(query);

    RangeQuery 的構(gòu)造函數(shù)的參數(shù)分別代表起始、結(jié)束、是否包括邊界。這樣我們就可以按照要求檢索了。

    第四、? 使用前綴檢索 PrefixQuery

    這個(gè)檢索的機(jī)制有點(diǎn)類似于 indexOf() 從前綴查找。這個(gè)常在英文中使用,中文中就很少使用了。代碼如下:

    IndexSearcher searcher = new IndexSearcher("c:\\index");

    ?????? Term pre1 = new Term("name", "Da");

    ?????? query = new PrefixQuery(pre1);

    ?????? hits = searcher.search(query);

    第五、? 多關(guān)鍵字的搜索 PhraseQuery

    可以多個(gè)關(guān)鍵字同時(shí)查詢。使用如下:

    query = new PhraseQuery();

    ?????? query.add(word1);

    ?????? query.add(word2);

    ?????? query.setSlop(0);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "'david' 'mary' 緊緊相隔的 Document");

    ?????? query.setSlop(2);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "'david' 'mary' 中相隔兩個(gè)詞的短語(yǔ) ");

    ??? 這里我們要注意 query.setSlop(); 這個(gè)方法的含義。

    query.setSlop(0);? 緊緊相連 (這個(gè)的條件比較苛刻)

    query.setSlop(2);? 相隔

    第六、? 使用短語(yǔ)綴搜索 PharsePrefixQuery

    使用 PharsePrefixQuery 可以很容易的實(shí)現(xiàn)相關(guān)短語(yǔ)的檢索功能。

    實(shí)例:

    query = new PhrasePrefixQuery();

    ?????? // 加入可能的所有不確定的詞

    Term word1 = new Term("content", "david");

    ?????? Term word2 = new Term("content", "mary");

    ?????? Term word3 = new Term("content", "smith");

    ?????? Term word4 = new Term("content", "robert");

    ?????? query.add(new Term[]{word1, word2});

    ?????? // 加入確定的詞

    ?????? query.add(word4);

    ?????? query.setSlop(2);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, " 存在短語(yǔ) 'david robert' 'mary robert' 的文檔 ");

    第七、? 相近詞語(yǔ)的搜索 fuzzyQuery

    可以通俗的說(shuō)它是一種模糊查詢。

    ?

    ?

    實(shí)例:

    Term word1 = new Term("content", "david");

    ?????? Hits hits = null;

    ?????? FuzzyQuery query = null;

    ?????? query = new FuzzyQuery(word1);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits," 'david' 相似的詞 ");

    第八、? 使用通配符搜索 WildcardQuery

    實(shí)例:

    IndexSearcher searcher = new IndexSearcher("c:\\index");

    ?????? Term word1 = new Term("content", "*ever");

    ?????? Term word2 = new Term("content", "wh?ever");

    ?????? Term word3 = new Term("content", "h??ever");

    ?????? Term word4 = new Term("content", "ever*");

    ?????? WildcardQuery query = null;

    ?????? Hits hits = null;

    ?????? query = new WildcardQuery(word1);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "*ever");

    ?????? query = new WildcardQuery(word2);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "wh?ever");?????

    ?????? query = new WildcardQuery(word3);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "h??ever");?????

    ?????? query = new WildcardQuery(word4);

    ?????? hits = searcher.search(query);

    ?????? printResult(hits, "ever*");

    ??? 由上可以看出通配符?代便 1 個(gè)字符, * 代表 0 到多個(gè)字符。

    Lucene 現(xiàn)在支持以上八中的搜索方式,我們可以根據(jù)需要選擇適合自己的搜索方式。當(dāng)然上面提供的一些可能對(duì)英文還是比較有效,中文就不可取了,所以我們開(kāi)始想想百度,我們只在一個(gè)輸入框中搜索結(jié)果。有了這個(gè)疑問(wèn)我們揭開(kāi)下一章的討論吧!

    查詢字符串的解析:這個(gè)就是我們經(jīng)常在一個(gè)輸入框中輸入我們要檢索的文字,交給搜索引擎去幫我們分詞。

    QueryParser 類就是對(duì)查詢字符串的解析類。

    看看它的用法:

    ?

    query = QueryParser.parse(key1, "name", new StandardAnalyzer());

    hits = searcher.search(query);

    它直接返回一個(gè) Query 對(duì)象。需要傳入的參數(shù)分別是:

    用戶需要查詢的字符串、需要檢索的對(duì)應(yīng)字段名稱、采用的分詞類。

    Analyzer analyzer = new CJKAnalyzer();

    String[] fields = {"filename", "content"};

    Query query = MultiFieldQueryParser.parse(searchword, fields, analyzer);

    Hits hits = searcher.search(query);

    QueryParser 的“與” “或”:

    QueryParser 之間默認(rèn)是或,我們想改變?yōu)榕c的話加入以下代碼:

    QueryParser.setOperator(QueryParser.DEFAULT_OPERATOR_AND);

    就可以了。

    5????????? 高級(jí)搜索技巧

    前面我們已經(jīng)介紹了一般情況下 lucene 的使用技巧,現(xiàn)在我們探討一下高級(jí)搜索的技巧吧!

    1、 對(duì)搜索結(jié)果進(jìn)行排序:

    1) 使用 sort 類排序:

    ??? Sort sort = new Sort();

    ??? ??? hits = searcher.search(query,sort);

    這種方式是使用默認(rèn)的 sort 排序方式進(jìn)行排序。默認(rèn)的 sort 排序是按照相關(guān)度進(jìn)行排序。即通過(guò) luence 的評(píng)分機(jī)制進(jìn)行排序。

    2) 對(duì)某一字段進(jìn)行排序

    ?????? Sort sort = new Sort( content );

    ? ??? hits = searcher.search(query,sort);

    3) 對(duì)多個(gè)字段進(jìn)行排序

    Sort sort = new Sort(new SortField[]{new SortField("title"),new SortField("contents")});

    hits = searcher.search(query,sort);

    2、 多域搜索和多索引搜索:

    在使用 luecene 時(shí),如果查詢的只是某些 terms ,而不關(guān)心這些詞條到時(shí)來(lái)自那個(gè)字段中時(shí)。這時(shí)可以使用 MultiFieldQueryParser 類。這個(gè)用于用戶搜索含有某個(gè)關(guān)鍵字是否存在在字段中,他們之間的關(guān)系使用 OR 連接。即不管存在在哪一個(gè)字段都會(huì)顯示顯示出來(lái)。

    使用 MultiSearcher 可以滿足同時(shí)多索引的搜索需求。

    Searcher[] searchers = new Searcher[2];

    searchers[0] = new IndexSearcher(indexStoreB);

    searchers[1] = new IndexSearcher(indexStoreA);

    ??????? // 創(chuàng)建一個(gè)多索引檢索器

    Searcher mSearcher = new MultiSearcher(searchers);

    3、 ??? 對(duì)搜索結(jié)果進(jìn)行過(guò)濾:

    1)??? 對(duì)時(shí)間進(jìn)行過(guò)濾

    ? ?????? 通常情況下我們對(duì)搜索結(jié)果要進(jìn)行過(guò)濾顯示,即只顯示過(guò)濾后的結(jié)果。

    doc.add(Field.Keyword("datefield", DateField.timeToString(now - 1000)));

    DateFilter df1 = DateFilter.Before("datefield", now);

    2)??? ??? 查詢過(guò)濾器

    通過(guò)查詢過(guò)濾器可以過(guò)濾一部分的信息。

    Filter filter = new Filter()

    ??? ??? {

    ??? ?? public BitSet bits (IndexReader reader) throws IOException

    ??? ????? {

    ??? ??????? BitSet bitset = new BitSet(5);

    ??? ??????? bitset.set (1);

    ??? ??????? bitset.set (3);

    ??? ??????? return bitset;

    ??? ????? }

    ??? ??? };

    ??? ??? // 生成帶有過(guò)濾器的查詢對(duì)象

    ??? ??? Query filteredquery = new FilteredQuery (query, filter);

    ?????? // 返回檢索結(jié)果

    ??? ??? Hits hits = searcher.search (filteredquery);

    ?

    這樣我們就可以使用自己定義的過(guò)濾方式去過(guò)濾信息了。

    3)??? 帶緩存的過(guò)濾器:

    使用待緩存的過(guò)濾器我們可以重用過(guò)濾功能,如下:

    MockFilter filter = new MockFilter();

    ?CachingWrapperFilter cacher = new CachingWrapperFilter(filter);

    ??? ??? cacher.bits(reader);

    以上介紹完了現(xiàn)在學(xué)習(xí) luence ,沒(méi)有太詳細(xì)的介紹它的實(shí)現(xiàn),因?yàn)樗鼘?duì)于我們來(lái)說(shuō)是一個(gè)工具,既然是工具我們就要會(huì)用就可以了。

    posted on 2006-09-15 15:29 安文豪 閱讀(4260) 評(píng)論(11)  編輯  收藏

    FeedBack:
    # re: Lucene的學(xué)習(xí)
    2006-09-15 18:23 | stoneshao
    lucene對(duì)中文的支持不行,它沒(méi)有中文的詞庫(kù):(  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2006-09-16 12:40 | 讀者
    你的說(shuō)法是錯(cuò)的,lucene對(duì)中文是支持的。從二分詞來(lái)說(shuō),二分詞是實(shí)現(xiàn)中文檢索最簡(jiǎn)單的方法。當(dāng)然還有智能詞典分詞。相信百度就是這樣做的。  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2006-09-19 10:52 | =====ART OF JAVA=====
    車東寫(xiě)過(guò)的  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2006-09-20 10:28 | guest
    看了后很有收獲
    field中的unstored之類在高版本的lucene中Deprecated  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2006-11-22 09:12 | liu
    不錯(cuò) 介紹的很全面,對(duì)于應(yīng)用足夠了。  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2006-11-22 09:14 | liu
    CJKAnalyzer 就是專門(mén)針對(duì)亞洲國(guó)家(中國(guó)、小日本、和韓國(guó))的字庫(kù)進(jìn)行切分詞的  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2007-06-20 12:43 | manus
    呵呵 恩 寫(xiě)的不錯(cuò) 支持下  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2007-10-19 16:26 | gw_noah@126.com
    你的這篇文章寫(xiě)的太好了
    你的這篇文章寫(xiě)的太好了
    你的這篇文章寫(xiě)的太好了
    你的這篇文章寫(xiě)的太好了
    你的這篇文章寫(xiě)的太好了  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2008-03-07 22:54 | sly@167.com
    寫(xiě)得很好,大哥受用拉  回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2009-05-07 20:09 | 路過(guò)
    寫(xiě)的不錯(cuò) 支持下   回復(fù)  更多評(píng)論
      
    # re: Lucene的學(xué)習(xí)
    2011-03-20 21:33 | sgz
    問(wèn)個(gè)問(wèn)題,索引創(chuàng)建和搜索支不支持遠(yuǎn)程啊,就是我想把索引庫(kù)創(chuàng)建到另外一臺(tái)機(jī)子上去  回復(fù)  更多評(píng)論
      

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿(6)

    隨筆檔案(28)

    文章分類(3)

    文章檔案(4)

    最新隨筆

    搜索

    •  

    積分與排名

    • 積分 - 86493
    • 排名 - 666

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲成aⅴ人片在线观| 成人免费黄色网址| 好看的电影网站亚洲一区| h视频免费高清在线观看| 亚洲第一福利网站在线观看| 亚洲AV无码专区在线厂| 在线看片无码永久免费aⅴ| 亚洲国产精品成人AV在线| 成人无遮挡毛片免费看| 亚洲欧洲av综合色无码| 日本最新免费不卡二区在线| 国产成人久久精品亚洲小说| 免费又黄又爽又猛的毛片| 农村寡妇一级毛片免费看视频| 日产国产精品亚洲系列| 人碰人碰人成人免费视频| 在线亚洲精品福利网址导航| 中文字幕成人免费高清在线视频| 亚洲精品无码专区在线在线播放| 日本在线免费观看| 亚洲视频一区二区在线观看| 可以免费看黄的网站| 伊人久久亚洲综合影院首页| 最好免费观看韩国+日本| 西西人体大胆免费视频| 中文字幕亚洲综合久久男男| 在线看片免费人成视频播| 亚洲一区二区电影| 97性无码区免费| 亚洲精品天堂无码中文字幕| 免费女人18毛片a级毛片视频| 免费在线观看自拍性爱视频| 亚洲午夜国产精品无码老牛影视 | 亚洲精品国产精品乱码不卡√| a级毛片毛片免费观看久潮喷| 亚洲第一精品在线视频| 91免费播放人人爽人人快乐| 亚洲精品女同中文字幕| 亚洲区不卡顿区在线观看| 青青草原1769久久免费播放| 91亚洲自偷在线观看国产馆|