日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用Lucene建立搜索索引

發(fā)布時(shí)間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Lucene建立搜索索引 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文是我們名為“ Apache Lucene基礎(chǔ)知識(shí) ”的學(xué)院課程的一部分。

在本課程中,您將了解Lucene。 您將了解為什么這樣的庫(kù)很重要,然后了解Lucene中搜索的工作方式。 此外,您將學(xué)習(xí)如何將Lucene Search集成到您自己的應(yīng)用程序中,以提供強(qiáng)大的搜索功能。 在這里查看 !

目錄

1.簡(jiǎn)介 2.了解索引操作
2.1倒排索引 2.2字段類型 2.3細(xì)分 2.4文件編號(hào) 2.5搜索索引
3.創(chuàng)建索引 4.基本索引操作
4.1核心索引類 4.2將數(shù)據(jù)添加到索引
5.文件和領(lǐng)域
5.1文件 5.2領(lǐng)域 5.3在Lucene中增強(qiáng)文檔

1.簡(jiǎn)介

該索引是利用Lucene的任何組件的核心。 就像書籍的索引一樣,它組織所有數(shù)據(jù),以便可以快速訪問。 索引由包含一個(gè)或多個(gè)字段的文檔組成。 文檔和字段可以代表我們選擇的任何內(nèi)容,但一個(gè)常見的隱喻是:文檔表示數(shù)據(jù)庫(kù)表中的條目,而字段類似于表中的字段。

2.了解索引操作

讓我們看一下Lucene搜索索引的圖形表示。

圖1

簡(jiǎn)而言之,當(dāng)Lucene對(duì)文檔進(jìn)行索引時(shí),它會(huì)將其分解為許多術(shù)語。 然后,它將術(shù)語存儲(chǔ)在索引文件中,其中每個(gè)術(shù)語與包含該術(shù)語的文檔相關(guān)聯(lián)。 我們可以把它當(dāng)作一個(gè)哈希表。 術(shù)語是使用分析器生成的,該分析器將每個(gè)單詞的詞根都提取出來。 發(fā)出查詢時(shí),將通過用于構(gòu)建索引的同一分析器來處理該查詢,然后使用該分析器在索引中查找匹配項(xiàng)。 這提供了與查詢匹配的文檔列表。

現(xiàn)在,讓我們看一下整個(gè)Lucene搜索過程。

基本概念是索引,文檔,字段和術(shù)語。

  • 索引包含文檔的集合。
  • 文檔是字段的集合。
  • 字段是術(shù)語的集合。
  • 術(shù)語是成對(duì)的字符串<field,term-string>。
  • 2.1倒排索引

    索引存儲(chǔ)有關(guān)術(shù)語的統(tǒng)計(jì)信息,以使基于術(shù)語的搜索更加高效。 Lucene的索引屬于稱為反向索引的索引族。 這是因?yàn)樗梢蚤L(zhǎng)期列出包含它的文檔。 這與文檔中列出術(shù)語的自然關(guān)系相反。

    2.2字段類型

    在Lucene中,可以存儲(chǔ)字段,在這種情況下,它們的文本將以非反轉(zhuǎn)的方式按字面意義存儲(chǔ)在索引中。 反轉(zhuǎn)的字段稱為索引。 字段可以被存儲(chǔ)和被索引。

    可以將字段的文本標(biāo)記為要索引的術(shù)語,或者可以將字段的文本從字面上用作要索引的術(shù)語。 大多數(shù)字段都是標(biāo)記化的,但有時(shí)對(duì)于某些標(biāo)識(shí)符字段按字面意義進(jìn)行索引很有用。

    2.3細(xì)分

    Lucene索引可以由多個(gè)子索引或段組成。 每個(gè)段都是完全獨(dú)立的索引,可以分別進(jìn)行搜索。 索引按以下方式演變:

  • 為新添加的文檔創(chuàng)建新的細(xì)分。
  • 合并現(xiàn)有的細(xì)分。
  • 搜索可能涉及多個(gè)段和/或多個(gè)索引,每個(gè)索引可能由一組段組成。
  • 2.4文件編號(hào)

    在內(nèi)部,Lucene通過整數(shù)文檔號(hào)引用文檔。 添加到索引的第一個(gè)文檔編號(hào)為零,并且隨后添加的每個(gè)文檔的編號(hào)都比前一個(gè)大。

    請(qǐng)注意,文檔編號(hào)可能會(huì)更改,因此在將這些編號(hào)存儲(chǔ)在Lucene之外時(shí)應(yīng)格外小心。 特別是,在以下情況下數(shù)字可能會(huì)更改:

    存儲(chǔ)在每個(gè)段中的數(shù)字僅在該段內(nèi)是唯一的,并且必須進(jìn)行轉(zhuǎn)換才能在更大的上下文中使用它們。 標(biāo)準(zhǔn)技術(shù)是根據(jù)該段中使用的數(shù)字范圍為每個(gè)段分配一個(gè)值范圍。 要將文檔編號(hào)從段轉(zhuǎn)換為外部值,需要添加段的基本文檔編號(hào)。 要將外部值轉(zhuǎn)換回特定于細(xì)分的值,可以通過外部值所在的范圍來標(biāo)識(shí)細(xì)分,然后減去細(xì)分的基值。 例如,可以合并兩個(gè)五個(gè)文檔的段,以便第一個(gè)段的基值為零,第二個(gè)為五個(gè)。 第二段的文檔三的外部值為8。

    刪除文檔后,在編號(hào)中會(huì)留出空白。 隨著索引通過合并的發(fā)展,這些最終被刪除。 合并段時(shí)刪除已刪除的文檔。 因此,新合并的段在編號(hào)上沒有間隙。

    2.5搜索索引

    搜索索引由javascript函數(shù)定義。 它以類似于視圖的地圖功能的方式運(yùn)行在所有文檔上,并定義了搜索可查詢的字段。 搜索索引是數(shù)據(jù)庫(kù)的一種變體。 它與RDBMS相似,因?yàn)樗枰焖俨檎颐荑€,但是大部分?jǐn)?shù)據(jù)駐留在輔助存儲(chǔ)上。

    3.創(chuàng)建索引

    到目前為止,我們已經(jīng)看到了Lucene索引的所有組成部分。 在本節(jié)中,我們將使用Lucene索引創(chuàng)建文檔索引。

    考慮一個(gè)項(xiàng)目,學(xué)生在其中提交年度雜志文章。 輸入控制臺(tái)包含學(xué)生姓名,文章標(biāo)題,文章類別和文章正文的選項(xiàng)。 我們假設(shè)該項(xiàng)目正在網(wǎng)絡(luò)上運(yùn)行并且可以通過它進(jìn)行訪問。 要為這篇文章建立索引,我們需要文章本身,作者的姓名,撰寫日期,文章的主題,文章的標(biāo)題以及文件所在的URL。 利用這些信息,我們可以構(gòu)建一個(gè)程序,該程序可以正確索引文章以使其易于查找。

    讓我們看一下我們類的基本框架,包括我們將需要的所有導(dǎo)入。

    import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Hits; import java.util.Date; public class ArticleIndexer { }

    我們需要添加的第一件事是將文章轉(zhuǎn)換為Document對(duì)象的方法。

    為此,我們將使用方法createDocument() ,

    private Document createDocument(String article, String author,String title, String topic,String url, Date dateWritten) { Document document = new Document();document.add(Field.Text("author", author));document.add(Field.Text("title", title));document.add(Field.Text("topic", topic));document.add(Field.UnIndexed("url", url));document.add(Field.Keyword("date", dateWritten));document.add(Field.UnStored("article", article));return document;}

    首先,我們創(chuàng)建一個(gè)新的Document對(duì)象。 接下來要做的是將文章的不同部分添加到Document 。 我們?yōu)槊總€(gè)部分提供的名稱完全是任意的,并且像HashMap鍵一樣工作。 使用的名稱必須是String 。 Document的add方法將采用一個(gè)Field對(duì)象,該對(duì)象是使用Field類提供的靜態(tài)方法之一構(gòu)建的。 提供了四種將Field對(duì)象添加到Document的方法。

    Field.Keyword –數(shù)據(jù)已存儲(chǔ)并建立索引,但未標(biāo)記化。 這對(duì)于應(yīng)保留不變的數(shù)據(jù)(例如日期)最有用。 實(shí)際上,Field.Keyword可以將Date對(duì)象作為輸入。

    Field.Text –數(shù)據(jù)被存儲(chǔ),索引和標(biāo)記化。 Field.Text字段不應(yīng)用于諸如文章本身之類的大量數(shù)據(jù),因?yàn)樗饕龑⒆兊梅浅4?#xff0c;因?yàn)樗鼘恼碌耐暾北疽约皹?biāo)記化的版本。

    Field.UnStored –不存儲(chǔ)數(shù)據(jù),但對(duì)其進(jìn)行索引和標(biāo)記化。 大量數(shù)據(jù)(例如文章的文本)應(yīng)放置在未存儲(chǔ)的索引中。

    Field.UnIndexed –數(shù)據(jù)已存儲(chǔ)但未建立索引或標(biāo)記化。 它與要與搜索結(jié)果一起返回的數(shù)據(jù)一起使用,但實(shí)際上不會(huì)在該數(shù)據(jù)上進(jìn)行搜索。 在我們的示例中,由于我們不允許搜索URL,因此沒有理由對(duì)其進(jìn)行索引,但是我們希望在找到搜索結(jié)果后將其返回給我們。

    現(xiàn)在我們有了一個(gè)Document對(duì)象,我們需要獲得一個(gè)IndexWriter來將此Document寫入索引。

    String indexDirectory = "lucene-index"; private void indexDocument(Document document) throws Exception {Analyzer analyzer = new StandardAnalyzer();IndexWriter writer = new IndexWriter(indexDirectory, analyzer, false);writer.addDocument(document);writer.optimize();writer.close();}

    我們首先創(chuàng)建StandardAnalyzer ,然后使用分析器創(chuàng)建IndexWriter 。 在構(gòu)造函數(shù)中,我們必須指定索引將駐留的目錄。 構(gòu)造函數(shù)末尾的布爾值告訴IndexWriter是創(chuàng)建新索引還是添加到現(xiàn)有索引。 在將新文檔添加到現(xiàn)有索引時(shí),我們將指定false。 然后,我們將Document添加到索引。 最后,我們優(yōu)化然后關(guān)閉索引。 如果要添加多個(gè)Document對(duì)象,則應(yīng)始終進(jìn)行優(yōu)化,然后在將所有Document對(duì)象都添加到索引之后關(guān)閉索引。

    現(xiàn)在,我們只需要添加一種將各個(gè)部分組合在一起的方法即可。

    為了驅(qū)動(dòng)索引??操作,我們將編寫一個(gè)indexArticle()一些參數(shù)的方法indexArticle() 。

    public void indexArticle(String article, String author,String title, String topic,String url, Date dateWritten)throws Exception {Document document = createDocument(article, author,title, topic,url, dateWritten);indexDocument(document);}

    對(duì)文章運(yùn)行該文章會(huì)將其添加到索引中。 將IndexWriter構(gòu)造函數(shù)中的布爾值更改為true會(huì)創(chuàng)建一個(gè)索引,因此我們應(yīng)該在第一次創(chuàng)建索引時(shí)以及每次要從頭開始重建索引時(shí)使用它。 現(xiàn)在我們已經(jīng)構(gòu)建了索引,我們需要在索引中搜索文章。

    索引存儲(chǔ)為單個(gè)目錄中的一組文件。

    索引由任意數(shù)量的獨(dú)立段組成,這些段存儲(chǔ)有關(guān)已索引文檔子集的信息。 每個(gè)段都有自己的術(shù)語詞典,術(shù)語詞典索引和文檔存儲(chǔ)(存儲(chǔ)的字段值)。 所有段數(shù)據(jù)都存儲(chǔ)在_xxxxx.cfs文件中,其中xxxxx是段名稱。

    創(chuàng)建索引段文件后,將無法對(duì)其進(jìn)行更新。 新文檔將添加到新段中。 刪除的文檔僅在可選的.del文件中標(biāo)記為已刪除。

    4.基本索引操作

    索引數(shù)據(jù)

    Lucene讓我們可以索引文本格式的任何可用數(shù)據(jù)。 Lucene幾乎可以用于任何數(shù)據(jù)源,只要可以從中提取文本信息即可。 我們可以使用Lucene對(duì)存??儲(chǔ)在HTML文檔,Microsoft Word文檔,PDF文件等中的數(shù)據(jù)進(jìn)行索引和搜索。 索引數(shù)據(jù)的第一步是使其以簡(jiǎn)單文本格式可用。 可以使用自定義解析器和數(shù)據(jù)轉(zhuǎn)換器。

    索引過程

    索引編制是將文本數(shù)據(jù)轉(zhuǎn)換為便于快速搜索的格式的過程。 一個(gè)簡(jiǎn)單的類比是您在書末找到的索引:該索引將您指向書中出現(xiàn)的主題的位置。

    Lucene將輸入數(shù)據(jù)存儲(chǔ)在稱為反向索引的數(shù)據(jù)結(jié)構(gòu)中,該數(shù)據(jù)結(jié)構(gòu)作為一組索引文件存儲(chǔ)在文件系統(tǒng)或內(nèi)存中。 大多數(shù)Web搜索引擎使用反向索引。 它使用戶可以執(zhí)行快速的關(guān)鍵字查找,并找到與給定查詢匹配的文檔。 在將文本數(shù)據(jù)添加到索引之前,它需要由分析器處理(使用分析過程)。

    分析

    分析將文本數(shù)據(jù)轉(zhuǎn)換為基本的搜索單位,稱為術(shù)語。 在分析過程中,文本數(shù)據(jù)會(huì)經(jīng)歷多種操作:提取單詞,刪除常用單詞,忽略標(biāo)點(diǎn)符號(hào),將單詞簡(jiǎn)化為詞根形式,將單詞更改為小寫字母等。分析僅在建立索引和查詢解析之前進(jìn)行。 分析將文本數(shù)據(jù)轉(zhuǎn)換為標(biāo)記,并將這些標(biāo)記作為術(shù)語添加到Lucene索引中。

    Lucene帶有各種內(nèi)置分析器,例如SimpleAnalyzer , StandardAnalyzer , StopAnalyzer , SnowballAnalyzer等。 它們?cè)跇?biāo)記文本和應(yīng)用過濾器的方式上有所不同。 由于分析會(huì)在索引編制之前刪除單詞,因此會(huì)減小索引大小,但會(huì)對(duì)查詢處理的精度產(chǎn)生負(fù)面影響。 通過使用Lucene提供的基本構(gòu)建塊創(chuàng)建自定義分析器,可以對(duì)分析過程進(jìn)行更多控制。 表1顯示了一些內(nèi)置分析儀及其處理數(shù)據(jù)的方式。

    4.1核心索引類

    目錄

    代表索引文件存儲(chǔ)位置的抽象類。 通常主要使用兩個(gè)子類:

    FSDirectory —目錄的實(shí)現(xiàn),在實(shí)際的文件系統(tǒng)中存儲(chǔ)索引。 這對(duì)于大索引很有用。

    RAMDirectory —將所有索引存儲(chǔ)在內(nèi)存中的實(shí)現(xiàn)。 這適用于較小的索引,這些索引可以完全加載到內(nèi)存中,并在應(yīng)用程序終止時(shí)銷毀。 由于索引保存在內(nèi)存中,因此速度相對(duì)較快。

    分析儀

    如所討論的,分析器負(fù)責(zé)預(yù)處理文本數(shù)據(jù)并將其轉(zhuǎn)換為存儲(chǔ)在索引中的令牌。 IndexWriter接受用于對(duì)數(shù)據(jù)建立索引之前對(duì)其進(jìn)行標(biāo)記化的分析器。 為了正確地為文本建立索引,您應(yīng)該使用適合需要被索引的文本語言的分析器。

    默認(rèn)分析器適用于英語。 Lucene沙箱中還有其他一些分析器,包括中文,日文和韓文的分析器。

    IndexDeletionPolicy

    用于實(shí)現(xiàn)自定義從索引目錄中刪除過時(shí)提交的策略的接口。 默認(rèn)的刪除策略是KeepOnlyLastCommitDeletionPolicy ,它僅保留最新的提交,并在完成新提交后立即刪除所有先前的提交。

    索引作家

    創(chuàng)建或維護(hù)索引的類。 它的構(gòu)造函數(shù)接受一個(gè)布爾值,該布爾值確定是創(chuàng)建新索引還是打開現(xiàn)有索引。 它提供了添加,刪除或更新索引中文檔的方法。

    對(duì)索引所做的更改最初會(huì)在內(nèi)存中進(jìn)行緩沖,并定期刷新到索引目錄。 IndexWriter公開了幾個(gè)字段,這些字段控制索引在內(nèi)存中的緩沖方式以及如何將其寫入磁盤。 除非調(diào)用IndexWriter的commit或close方法,否則對(duì)IndexReader不到對(duì)索引所做的更改。 IndexWriter為目錄創(chuàng)建一個(gè)鎖定文件,以防止索引同時(shí)更新導(dǎo)致索引損壞。 IndexWriter允許用戶指定可選的索引刪除策略。

    4.2將數(shù)據(jù)添加到索引

    將文本數(shù)據(jù)添加到索引涉及兩個(gè)類。

    字段表示在搜索中查詢或檢索的一條數(shù)據(jù)。 Field類封裝一個(gè)字段名稱及其值。 Lucene提供了一些選項(xiàng)來指定是否需要對(duì)字段進(jìn)行索引或分析以及是否需要存儲(chǔ)其值。 在創(chuàng)建字段實(shí)例時(shí)可以傳遞這些選項(xiàng)。 下表顯示了字段元數(shù)據(jù)選項(xiàng)的詳細(xì)信息。

    選項(xiàng) 描述
    Field.Store.Yes 用于存儲(chǔ)字段的值。 適用于顯示搜索結(jié)果的字段,例如文件路徑和URL。
    Field.Store.No 字段值未存儲(chǔ)-例如,電子郵件正文。
    Field.Index.No 適用于未搜索的字段-通常與存儲(chǔ)的字段(例如文件路徑)一起使用。
    Field.Index.ANALYZED 用于索引但未分析的字段。 它完整??地保留了字段的原始值,例如日期和個(gè)人名稱。
    Field.Index.NOT_ANALYZED 用于索引但未分析的字段。 它完整??地保留了字段的原始值,例如日期和個(gè)人名稱。

    字段元數(shù)據(jù)選項(xiàng)的詳細(xì)信息

    而文檔是字段的集合。 Lucene還支持增強(qiáng)文檔和字段,如果要重視某些索引數(shù)據(jù),這是一個(gè)有用的功能。 為文本文件建立索引包括將文本數(shù)據(jù)包裝在字段中,創(chuàng)建文檔,使用字段填充文本,以及使用IndexWriter將文檔添加到索引中。

    5.文件和領(lǐng)域

    如您先前所見,文檔是索引和搜索過程的單元。

    5.1文件

    文檔是一組字段。 每個(gè)字段都有一個(gè)名稱和一個(gè)文本值。 字段可以與文檔一起存儲(chǔ),在這種情況下,它會(huì)隨文檔的搜索命中一起返回。 因此,每個(gè)文檔通常應(yīng)包含一個(gè)或多個(gè)唯一標(biāo)識(shí)它的存儲(chǔ)字段。

    您將文檔添加到索引,并且在執(zhí)行搜索之后,您將獲得結(jié)果列表,它們是文檔。 文檔只是字段的非結(jié)構(gòu)化集合。

    5.2領(lǐng)域

    字段是Lucene.net的實(shí)際內(nèi)容所有者:它們基本上是一個(gè)哈希表,具有名稱和值。 如果我們擁有無限的磁盤空間和無限的處理能力,那就是我們所需要知道的。 但是不幸的是,磁盤空間和處理能力受到限制,因此您不能僅分析所有內(nèi)容并將其存儲(chǔ)到索引中。 但是Lucene.net提供了將字段添加到索引的不同方法。

    Lucene提供了四種不同類型的字段供開發(fā)人員選擇: Keyword , UnIndexed , UnStored和Text 。 您應(yīng)該使用哪種字段類型取決于您要如何使用該字段及其值。

    關(guān)鍵字字段未標(biāo)記,但被逐字索引并存儲(chǔ)在索引中。 此字段適用于原始值應(yīng)完整保留的字段,例如URL,日期,個(gè)人姓名,社會(huì)保險(xiǎn)號(hào),電話號(hào)碼等。

    未索引字段既沒有標(biāo)記也沒有索引,但它們的值存儲(chǔ)在逐字索引中。 該字段適用于需要與搜索結(jié)果一起顯示但絕不會(huì)直接搜索其值的字段。 由于未對(duì)這種類型的字段建立索引,因此對(duì)其進(jìn)行搜索很慢。 由于此類型的字段的原始值存儲(chǔ)在索引中,因此如果存在索引大小的問題,則此類型不適合存儲(chǔ)具有非常大值的字段。

    未存儲(chǔ)字段與未索引字段相反。 此類型的字段已標(biāo)記并建立索引,但未存儲(chǔ)在索引中。 此字段適用于索引大量不需要以其原始形式檢索的文本,例如網(wǎng)頁正文或任何其他類型的文本文檔。

    文本字段被標(biāo)記,索引并存儲(chǔ)在索引中。 這意味著可以搜索此類型的字段,但請(qǐng)注意存儲(chǔ)為“文本”字段的字段的大小。

    如果您回顧一下LuceneIndexExample類,您將看到我使用了Text字段:

    document.add(Field.Text("fieldname", text));

    如果要更改字段fieldname的類型,我們將調(diào)用Field類的其他方法之一:

    document.add(Field.Keyword("fieldname", text));

    要么

    document.add(Field.UnIndexed("fieldname", text));

    要么

    document.add(Field.UnStored("fieldname", text));

    盡管Field.Text , Field.Keyword , Field.UnIndexed和Field.UnStored調(diào)用最初看起來像是對(duì)構(gòu)造函數(shù)的調(diào)用,但它們實(shí)際上只是對(duì)不同F(xiàn)ield類方法的調(diào)用。 表1總結(jié)了不同的字段類型。

    現(xiàn)場(chǎng)方法/類型 代幣化 索引 已儲(chǔ)存
    Field.Keyword(String, String) 沒有
    Field.UnIndexed(String, String) 沒有 沒有
    Field.UnStored(String, String) 沒有
    Field.Text(String, String)
    Field.Text(String, Reader) 沒有

    表1:不同字段類型的概述。

    5.3在Lucene中增強(qiáng)文檔

    在“信息檢索”中,文檔與搜索的相關(guān)性通過與查詢的相似程度來衡量。 Lucene中實(shí)現(xiàn)了幾種相似性模型,您可以通過擴(kuò)展相似性類并使用Lucene保存的索引統(tǒng)計(jì)信息來實(shí)現(xiàn)自己的相似性模型。 還可以為文檔分配靜態(tài)分?jǐn)?shù),以表示它們?cè)谡麄€(gè)語料庫(kù)中的重要性,而與正在執(zhí)行的查詢無關(guān),例如其受歡迎程度,評(píng)分或PageRank。

    在Lucene 4.0之前,您可以通過調(diào)用document.setBoost為文檔分配靜態(tài)分?jǐn)?shù)。 在內(nèi)部,通過將字段的提升因子乘以文檔的提升因子,將提升應(yīng)用于文檔的每個(gè)字段。 但是,這永遠(yuǎn)無法正常工作,并且取決于所執(zhí)行查詢的類型,可能根本不會(huì)影響文檔的排名。

    通過在Lucene中添加DocValues,增強(qiáng)文檔就像添加NumericDocValuesField并將其用于CustomScoreQuery一樣簡(jiǎn)單, CustomScoreQuery將計(jì)算所得的分?jǐn)?shù)乘以“ boost”字段的值。 下面的代碼示例說明了如何實(shí)現(xiàn)此目的:

    // add two documents to the index Document doc = new Document(); doc.add(new TextField("f", "test document", Store.NO)); doc.add(new NumericDocValuesField("boost", 1L)); writer.addDocument(doc); doc = new Document(); doc.add(new TextField("f", "test document", Store.NO)); doc.add(new NumericDocValuesField("boost", 2L)); writer.addDocument(doc); // search for 'test' while boosting by field 'boost' Query baseQuery = new TermQuery(new Term("f", "test")); Query boostQuery = new FunctionQuery(new LongFieldSource("boost")); Query q = new CustomScoreQuery(baseQuery, boostQuery); searcher.search(q, 10);

    通過編寫一個(gè)簡(jiǎn)單的公式,新的Expressions模塊也可以用于增強(qiáng)文檔,如下所示。 盡管它比使用CustomScoreQuery更為冗長(zhǎng),但它通過計(jì)算更復(fù)雜的公式(例如sqrt(_score)+ ln(boost))變得微不足道。

    Expression expr = JavascriptCompiler.compile("_score * boost"); SimpleBindings bindings = new SimpleBindings(); bindings.add(new SortField("_score", SortField.Type.SCORE)); bindings.add(new SortField("boost", SortField.Type.LONG)); Sort sort = new Sort(expr.getSortField(bindings, true)); searcher.search(baseQuery, null, 10, sort);

    既然Lucene允許在不重新索引文檔的情況下更新NumericDocValuesField ,那么您可以將頻繁更改的字段(受歡迎程度,評(píng)分,價(jià)格,最后修改時(shí)間…)并入提升因子中,而無需每次對(duì)其中任何一個(gè)更改時(shí)都重新索引文檔。

    翻譯自: https://www.javacodegeeks.com/2015/09/building-a-search-index-with-lucene.html

    總結(jié)

    以上是生活随笔為你收集整理的用Lucene建立搜索索引的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。