成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

搜索為將 -- lucene6.6 學(xué)習(xí)心得

yanest / 899人閱讀

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

前言

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

IndexWriterConfig 的構(gòu)造方法

Directory 的生成方法 FSDirectory.open()

legacyXXField 與legacyNumericRangeQuery 的廢棄

BooleanQuery() 方法的改變

setBoost()方法的廢除

中文分詞器的改進(jìn)

下面,就讓我詳細(xì)的整理出不同。

1.IndexWriterConfig

以下是 IndexWriterConfig 4.10 的源碼部分

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

而 IndexWriterConfig 6.6 中

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

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

2.Directory

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

Directory di = FSdirectory.open();

以下是 IndexWriterConfig 4.10 的源碼部分

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

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

而 IndexWriterConfig 6.6 中

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

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

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

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

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.

以及開(kāi)發(fā)者的測(cè)試

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

因?yàn)镻ointValues 更快,更小,更便于資源的利用。所以,所有的 legacy**都被取代了。
3.代碼對(duì)比

代碼的話(huà),lucene 的官方文檔給了一個(gè)簡(jiǎn)單的例子

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

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

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

還要注意的是:

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

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

例:

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 中的說(shuō)法

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

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

    /* 構(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 的,只能在類(lèi)的內(nèi)部調(diào)用。
并且最大的改變是多出了靜態(tài)內(nèi)部類(lèi) Builder
以下是 Builder 的部分源碼

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

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

3.代碼對(duì)比

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

//原先的 使用方法
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)建索引時(shí)的 Boost -- 權(quán)值。根據(jù)一系列計(jì)算方法 (舊版采用的 空間向量模型算法),最終得出其打分。
代碼如下 :

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

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

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.

中文翻譯后:

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

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

BoostAttribute

termsEnum

MultiQuery

lucene 的官方文檔中對(duì) 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.
//很明顯,這是個(gè)抽象方法,必須由子類(lèi)實(shí)現(xiàn)

BoostAttribute 是個(gè)接口,其實(shí)現(xiàn)類(lèi) BoostAttributeImpl 中源碼如下

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

推測(cè)使用如下 --- 以下是偽代碼

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

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

另外,還有兩個(gè)便于操作的類(lèi):

BoostQuery

MultiFieldQueryParser

1.BoostQuery

源碼如下:

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

分析:
相當(dāng)于一個(gè)包裝類(lèi),將 Query 設(shè)置 Boost 值 ,然后包裝起來(lái)。
再通過(guò)復(fù)合查詢(xún)語(yǔ)句,可以突出 Query 的優(yōu)先級(jí)。

使用如下:

//查詢(xún) 索引域 中的 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);
//復(fù)合語(yǔ)句查詢(xún)
BooleanQuery.Builder() builder = new new BooleanQuery.Builder();
builder.add(q3, Occur.MUST)
builder.add(q2, Occur.MUST)
//由于 file_name 的查詢(xún)語(yǔ)句經(jīng)過(guò) BoostQuery 的包裝
//因此 file_name 的優(yōu)先級(jí)更高。
BooleanQuery query = builder.build();

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

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

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

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

請(qǐng)看 下篇 文章。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67497.html

相關(guān)文章

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

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

    hedzr 評(píng)論0 收藏0
  • 搜索為將 -- solr 6.6 從入門(mén)到進(jìn)階 (二)

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

    luqiuwen 評(píng)論0 收藏0
  • 搜索為將 -- Solr 6.6 從入門(mén)到進(jìn)階(一)

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

    sPeng 評(píng)論0 收藏0
  • Lucene系列(一)快速入門(mén)

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

    騫諱護(hù) 評(píng)論0 收藏0
  • 什么是cdhlogstash

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

    白馬嘯西風(fēng) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

yanest

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<