国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

搜索為將 -- lucene6.6 學習心得

yanest / 896人閱讀

摘要:代碼如下值默認為而在新版中,方法被廢除根據(jù)的官方文檔中的說法中文翻譯后索引時權(quán)值被廢除,請將索引時打分因素添加入域中,然后在查詢時,使用功能性打分查詢語句,進行關(guān)聯(lián)查詢。

前言

學習的資料是 lucene 4.10 版本,比較沉舊,查閱最新的 lucene 版本 6.6 的官方文檔,整理出以下幾個使用中的不同。
從淺入深依次為 (注:不是根據(jù)版本先后)

IndexWriterConfig 的構(gòu)造方法

Directory 的生成方法 FSDirectory.open()

legacyXXField 與legacyNumericRangeQuery 的廢棄

BooleanQuery() 方法的改變

setBoost()方法的廢除

中文分詞器的改進

下面,就讓我詳細的整理出不同。

1.IndexWriterConfig

以下是 IndexWriterConfig 4.10 的源碼部分

    public IndexWriterConfig(Version matchVersion, Analyzer analyzer) {
        super(analyzer, matchVersion);
    }
    //這里的version 一般要寫為     
    Version 類中
    public static final Version LATEST;

而 IndexWriterConfig 6.6 中

    //無參構(gòu)造方法 
    public IndexWriterConfig() {
        this(new StandardAnalyzer());
    }
    //有參構(gòu)造方法
    public IndexWriterConfig(Analyzer analyzer) {
        super(analyzer);
        this.writer = new SetOnce();
    }

可以看出,在 6.6 版本中 version 不再是必要的,并且,存在無參構(gòu)造方法,可以直接使用默認的 StandardAnalyzer 分詞器。

2.Directory

正常創(chuàng)建 Directory 類的方法如下

Directory di = FSdirectory.open();

以下是 IndexWriterConfig 4.10 的源碼部分

    public static FSDirectory open(File path) throws IOException {
        return open(path, (LockFactory)null);
    }

這里可以看出 open 方法 用的參數(shù)類型 為File

而 IndexWriterConfig 6.6 中

    public static FSDirectory open(Path path) throws IOException {
        return open(path, FSLockFactory.getDefault());
    }

open 方法使用了 Path 類,這個類是 NIO 中的類,可以提高查詢的效率。
由 File 轉(zhuǎn)化為 Path 的 方法
--->

File file = new File (absolutePath);
Path path = file.toPath()
3.legacyXXField 與legacyNumericRangeQuery 1. 分析

根據(jù) 官方的 Migration Guide 中的說法

PointValues replaces NumericField (LUCENE-6917)

PointValues provides faster indexing and searching, a smaller index size, and less heap used at search time. See org.apache.lucene.index.PointValues for an introduction.

Legacy numeric encodings from previous versions of Lucene are deprecated as LegacyIntField, LegacyFloatField, LegacyLongField, and LegacyDoubleField, and can be searched with LegacyNumericRangeQuery.

以及開發(fā)者的測試

DimensionalValues seems to be better across the board (indexing time, indexing size, search-speed, search-time heap required) than NumericField, at least in my testing so far.

I think for 6.0 we should move IntField, LongField, FloatField, DoubleField and NumericRangeQuery to backward-codecs, and rename with Legacy prefix?

2.結(jié)論

PointValues 取代了NumericField

因為PointValues 更快,更小,更便于資源的利用。所以,所有的 legacy**都被取代了。
3.代碼對比

代碼的話,lucene 的官方文檔給了一個簡單的例子

   // add year 1970 to document
   document.add(new IntPoint("year", 1970));
   // index document
   writer.addDocument(document);
   ...
   // issue range query of 1960-1980
   Query query = IntPoint.newRangeQuery("year", 1960, 1980);
   TopDocs docs = searcher.search(query, ...);

另外我自己寫了一個 已經(jīng)@Deprecated的方法 與上面 進行對比

      // add year 1970 to document
   document.add(new IntField("year", 1970));
   // index document
   writer.addDocument(document);
   ...
   // issue range query of 1960-1980
   Query query = new NumericRangeQuery("year", 1960, 1980,false,false);
   TopDocs docs = searcher.search(query, ...);

還要注意的是:

如果要存儲,必須創(chuàng)建同名的StoredField類

如果要排序使用,必須同時創(chuàng)建同名的StoredField類與NumericDocValuesField類

例:

doc.add(new NumericDocValuesField("price",price));  
doc.add(new IntPoint("price",price));  
doc.add(new StoredField("price",price));
4.BooleanQuery() 的構(gòu)造方法改變 1.分析

根據(jù) 官方的 Migration Guide 中的說法

PhraseQuery, MultiPhraseQuery, and BooleanQuery made immutable (LUCENE-6531 LUCENE-7064 LUCENE-6570)
也就是說, BooleanQuery這個類 一旦建立就不能再改變了。

從源碼中我們可以更好的看出改變
lucene 4.10 的源碼里 BooleanQuery 的類 主要方法如下

    /* 構(gòu)造器*/
    public BooleanQuery() {
        this.disableCoord = false;
    }
    public BooleanQuery(boolean disableCoord) {
        this.disableCoord = disableCoord;
    }
    /*主要方法*/
    public void add(BooleanClause clause) {
        if(this.clauses.size() >= maxClauseCount) {
            throw new BooleanQuery.TooManyClauses();
        } else {
            this.clauses.add(clause);
        }
    }

lucene 6.6 的源碼里, BooleanQuery 的主要方法如下:

private BooleanQuery(boolean disableCoord, int minimumNumberShouldMatch, BooleanClause[] clauses) 

可以看出 , BooleanQuery 的構(gòu)造器的范圍是 private 的,只能在類的內(nèi)部調(diào)用。
并且最大的改變是多出了靜態(tài)內(nèi)部類 Builder
以下是 Builder 的部分源碼

    public static class Builder {
        private boolean disableCoord;
        private int minimumNumberShouldMatch;
        private final List clauses = new ArrayList();
        /* 無參構(gòu)造器 */
        // 相當于 BooleanQuery 的 構(gòu)造器
        public Builder() {
        }
        //相當于 BooleanQuery 的 add 方法
        public BooleanQuery.Builder add(Query query, Occur occur) {
            return this.add(new BooleanClause(query, occur));
        }
        //返回值是 BooleanQuery, 構(gòu)造一個BooleanQuery 類。
        public BooleanQuery build() {
            return new BooleanQuery(this.disableCoord, this.minimumNumberShouldMatch, (BooleanClause[])this.clauses.toArray(new BooleanClause[0]), null);
        }
    }
2.結(jié)論

通過用靜態(tài)內(nèi)部類實例化自身的方法,加強了類自身的穩(wěn)定性與安全性。避免可能發(fā)生的小意外,而導致代碼出現(xiàn)問題的可能性

3.代碼對比

下面給出代碼,可以更好的看出差別

//原先的 使用方法
BooleanQuery bq = new BooleanQuery();     
bq.add(q1, Occur.SHOULD);     
bq.add(q2, Occur.SHOULD); bq.add(q3, Occur.MUST); 

//現(xiàn)在的 使用方法
BooleanQuery bq = new BooleanQuery.Builder()
                                     .add(q1, Occur.SHOULD)    
                                     .add(q2, Occur.SHOULD)
                                     .add(q3, Occur.SHOULD)
                                     .build();
5. setBoost()方法的廢除

在 lucene 4.10 包中, setBoost方法被用于 相關(guān)度 的排序中。改變創(chuàng)建索引時的 Boost -- 權(quán)值。根據(jù)一系列計算方法 (舊版采用的 空間向量模型算法),最終得出其打分。
代碼如下 :

Field fi1 = new Field("id" , 1, STORE.YES);
// Boost 值默認為 1.0f 
fi1.setBoost(100f)
Document do = new Document();
do.add(fi1);

而在新版 lucene 6.6 中, setBoost 方法被 廢除
根據(jù)lucene 的官方文檔中的說法

org.apache.lucene.document.Field.setBoost(float)

Index-time boosts are deprecated, please index index-time scoring factors into a doc value field and combine them with the score at query time using eg. FunctionScoreQuery.

中文翻譯后:

索引時權(quán)值被廢除,請將索引時打分因素添加入field域中,然后在查詢時,使用功能性打分查詢語句,進行關(guān)聯(lián)查詢。

我在查看了 大部分關(guān)聯(lián)的 api 后,發(fā)現(xiàn)了幾個與之相關(guān)的 類

BoostAttribute

termsEnum

MultiQuery

lucene 的官方文檔中對 BoostAttribute 的描述是這樣的。

BoostAttribute --- >
Add this Attribute to a TermsEnum returned by MultiTermQuery.getTermsEnum(Terms,AttributeSource) and update the boost on each returned term.
方法描述如下

protected abstract TermsEnum getTermsEnum(Terms terms,AttributeSource atts)    
//Construct the enumeration to be used, expanding the pattern term.
//很明顯,這是個抽象方法,必須由子類實現(xiàn)

BoostAttribute 是個接口,其實現(xiàn)類 BoostAttributeImpl 中源碼如下

    public BoostAttributeImpl() {
    }
    public void setBoost(float boost) {
        this.boost = boost;
    }

推測使用如下 --- 以下是偽代碼

//設(shè)置 Boost 屬性
BoostAttribute ba = new BoostAttributeImpl();
ba.setBoost(100f);
//設(shè)置 Query 的實現(xiàn)類
Query query =  new MultiTermqueryChildren(new Terms());
TermEnum te = query.getTermsEnum(Terms,ba);

具體方法還不清楚,希望知道的大神可以給我解答

另外,還有兩個便于操作的類:

BoostQuery

MultiFieldQueryParser

1.BoostQuery

源碼如下:

    public BoostQuery(Query query, float boost) {
        this.query = (Query)Objects.requireNonNull(query);
        this.boost = boost;
    }

分析:
相當于一個包裝類,將 Query 設(shè)置 Boost 值 ,然后包裝起來。
再通過復合查詢語句,可以突出 Query 的優(yōu)先級。

使用如下:

//查詢 索引域 中的 file_name , file_content
Query q1 = new TermQuery(new Term(“file_name” ,”springmvc.txt”);
Query q2 = new TermQuery(new Term(“file_content”,”springmvc.txt”);
//將 q1 設(shè)置 Boost 值 
BoostQuery q3 = new BoostQuery(q1,100f);
//復合語句查詢
BooleanQuery.Builder() builder = new new BooleanQuery.Builder();
builder.add(q3, Occur.MUST)
builder.add(q2, Occur.MUST)
//由于 file_name 的查詢語句經(jīng)過 BoostQuery 的包裝
//因此 file_name 的優(yōu)先級更高。
BooleanQuery query = builder.build();

2.MultiFieldQueryParser
和原先版本相同 , 就不闡述源碼,直接上使用方法
使用如下 :

//設(shè)置組合查詢域
String[] fields = {"file_name","file_content"};

//設(shè)置評分,文件名稱中包括關(guān)鍵字的評分高
Map boosts = new HashMap();
boosts.put("file_name", 10.0f);

//創(chuàng)建查詢解析器
QueryParser queryParser =  new MultiFieldQueryParser(fields, new IKAnalyzer(), boosts);
//查詢文件名、文件內(nèi)容中包括“springmvc.txt”關(guān)鍵字的文檔,由于設(shè)置了文件名稱域的加權(quán)值高,所以名稱中匹配到關(guān)鍵字的應(yīng)該排在前邊
Query query = queryParser.parse("springmvc.txt");
6. 中文分詞器 -- iKAnalyzer 的 lucene 6.6 適配

請看 下篇 文章。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/67497.html

相關(guān)文章

  • Lucene系列(二)luke使用及索引文檔的基本操作

    摘要:系列文章系列一快速入門系列二使用及索引文檔的基本操作系列三查詢及高亮入門簡介地址下載地址是一個用于搜索引擎的,方便開發(fā)和診斷的可視化工具。使用作為其最低級別的搜索引擎基礎(chǔ)。截止,上述代碼所用的包皆為最新。 系列文章: Lucene系列(一)快速入門 Lucene系列(二)luke使用及索引文檔的基本操作 Lucene系列(三)查詢及高亮 luke入門 簡介: github地址:http...

    hedzr 評論0 收藏0
  • 搜索為將 -- solr 6.6 從入門到進階 (二)

    摘要:傳送門搜索為將入門現(xiàn)在介紹如何與數(shù)據(jù)庫整合。指定域的名稱指定域的類型指定使用的分詞器。結(jié)語因為時間有限,先介紹到這里。等下次有時間,將與的整合,以及一起進行總結(jié)。我的個人博客謝謝。 前言 上一篇已經(jīng)介紹了 solr 的基本操作。傳送門: 搜索為將 -- solr 入門現(xiàn)在介紹如何 與數(shù)據(jù)庫 整合。 solr managed-scheme 文檔 這個文檔位于 solrhomenew_co...

    luqiuwen 評論0 收藏0
  • 搜索為將 -- Solr 6.6 從入門到進階(一)

    摘要:將之更改為如下形式解釋一下,這里的根目錄是你自身的目錄。分析文件,發(fā)現(xiàn)一段配置但是,自己太菜,分析不出原因。 前言 1、私信請在SegmentFault 傳送點 https://segmentfault.com/a/1190000010959342,有問必答2、轉(zhuǎn)發(fā)請注明出處 http://3dot141.cn/blogs/29869.html,也給小可愛一點出名的機會嘛 一、版本介紹...

    sPeng 評論0 收藏0
  • Lucene系列(一)快速入門

    摘要:系列文章系列一快速入門系列二使用及索引文檔的基本操作系列三查詢及高亮是什么在維基百科的定義是一套用于全文檢索和搜索的開放源代碼程序庫,由軟件基金會支持和提供。全面準確和快速是衡量全文檢索系統(tǒng)的關(guān)鍵指標。結(jié)果列表有相關(guān)度排序。 系列文章: Lucene系列(一)快速入門 Lucene系列(二)luke使用及索引文檔的基本操作 Lucene系列(三)查詢及高亮 Lucene是什么? Luc...

    騫諱護 評論0 收藏0
  • 什么是cdhlogstash

     CDH Logstash是Cloudera Hadoop的一部分,是一個開源數(shù)據(jù)處理管道,可用于收集、解析、轉(zhuǎn)換和傳輸各種數(shù)據(jù)。它具有許多內(nèi)置的插件,可用于訪問各種數(shù)據(jù)源(例如文件、數(shù)據(jù)庫、消息隊列等),并將數(shù)據(jù)轉(zhuǎn)換為指定格式后發(fā)送到其他地方(例如數(shù)據(jù)庫、搜索引擎、分析平臺等)。  Logstash的工作流程包括三個主要部分:輸入、過濾和輸出。輸入插件用于收集數(shù)據(jù),過濾插件用于解析和轉(zhuǎn)換數(shù)據(jù),...

    白馬嘯西風 評論0 收藏0

發(fā)表評論

0條評論

yanest

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<