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

資訊專欄INFORMATION COLUMN

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

yanest / 900人閱讀

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

前言

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

IndexWriterConfig 的構造方法

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 中

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

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

2.Directory

正常創建 Directory 類的方法如下

Directory di = FSdirectory.open();

以下是 IndexWriterConfig 4.10 的源碼部分

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

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

而 IndexWriterConfig 6.6 中

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

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

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

根據 官方的 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.

以及開發者的測試

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.結論

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, ...);

另外我自己寫了一個 已經@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, ...);

還要注意的是:

如果要存儲,必須創建同名的StoredField類

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

例:

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

根據 官方的 Migration Guide 中的說法

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

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

    /* 構造器*/
    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 的構造器的范圍是 private 的,只能在類的內部調用。
并且最大的改變是多出了靜態內部類 Builder
以下是 Builder 的部分源碼

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

通過用靜態內部類實例化自身的方法,加強了類自身的穩定性與安全性。避免可能發生的小意外,而導致代碼出現問題的可能性

3.代碼對比

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

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

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

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

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 方法被 廢除
根據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.

中文翻譯后:

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

我在查看了 大部分關聯的 api 后,發現了幾個與之相關的 類

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.
//很明顯,這是個抽象方法,必須由子類實現

BoostAttribute 是個接口,其實現類 BoostAttributeImpl 中源碼如下

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

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

//設置 Boost 屬性
BoostAttribute ba = new BoostAttributeImpl();
ba.setBoost(100f);
//設置 Query 的實現類
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 設置 Boost 值 ,然后包裝起來。
再通過復合查詢語句,可以突出 Query 的優先級。

使用如下:

//查詢 索引域 中的 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 設置 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 的查詢語句經過 BoostQuery 的包裝
//因此 file_name 的優先級更高。
BooleanQuery query = builder.build();

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

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

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

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

請看 下篇 文章。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67497.html

相關文章

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

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

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

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

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

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

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

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

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

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

    白馬嘯西風 評論0 收藏0

發表評論

0條評論

yanest

|高級講師

TA的文章

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