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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索

發布時間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

lucene使用3.0.3

Lucene是用Java編寫的全文搜索引擎,可以為任何應用程序提供強大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API創建該索引,然后向該索引添加和刪除內容。 此外,它允許使用功能強大的搜索算法從該索引中搜索和檢索信息。 可以從不同的來源(如數據庫,文件系統以及網站)中提取存儲的數據。 在開始之前,讓我們先思考一下。

倒排索引

倒排索引是一種數據結構,用于存儲內容的映射以及包含該內容的對象的位置。 為了更加清楚,這里有一些示例

  • 圖書索引圖書索引包含重要的單詞以及包含這些單詞的頁面。 因此,書索引可幫助我們導航到包含特定單詞的頁面。
  • 使用價格范圍列出葡萄酒 –價格范圍是內容,葡萄酒名稱是具有該價格范圍的對象
  • 網站索引 -通過關鍵字列出網站地址。 例如,所有包含關鍵字“ Apache Lucene”的網頁的列表
  • 購物車 –按類別列出購物車中的物品。 ?
  • 多面搜索

    任何對象都可以具有多個屬性,每個屬性是該對象的一個方面分面搜索使我們可以基于多個分面來搜索對象的集合。 多面搜索也稱為多面導航或多面瀏覽 ,它使我們可以搜索根據多面組織結構組織的信息

    考慮一個購物車中的商品示例。 商品可以具有多個類別,例如類別,標題,價格,顏色,重量等。現在,商品搜索可以讓我們搜索花園類別中所有具有紅色且價格在30盧比到Rs之間的商品.40。

    Lucene為我們提供了一個API

  • 創建一個倒排索引。
  • 根據分面分類存儲信息。
  • 使用分面搜索檢索信息。
  • 所有以上這些使Lucene成為超快速的搜索引擎,它返回超相關的搜索結果。

    Lucene功能

  • 相關性排名搜索
  • 短語,接近度,通配符搜索。
  • 可插入式山墻分析儀。
  • 多面搜索。
  • 基于字段的排序
  • 范圍查詢
  • 多重索引搜索。
  • 快速索引150GB /小時。
  • 輕松備份和還原。
  • 小內存需求。
  • 增量加法和快速搜索。
  • 有關完整列表,請訪問此處: http : //lucene.apache.org/core/features.html

    Lucene概念和術語

  • 索引編制-索引編制涉及通過稱為“ IndexWriter ”的類將文檔添加到Lucene索引中。
  • 搜索 –搜索涉及借助名為“ IndexSearcher ”的類從Lucene索引中檢索文檔。
  • 文檔 – Lucene文檔是單個搜索和索引單元。 例如購物車中的物品。 Lucene索引可以包含數百萬個文檔。
  • 字段 –字段是任何文檔的屬性。 換句話說,字段是作為對象的文檔的各個方面。 例如,購物車中某商品的類別。 每個文檔可以具有多個字段。
  • 查詢 – Lucene有自己的查詢語言。 這使我們可以基于多個字段搜索文檔。 我們可以為一個字段分配權重,也可以對查詢使用布爾表達式,例如and和or。 例如– 返回購物車中屬于花園或家庭類別且顏色為紅色且價格低于1000盧比的所有物品。
  • 分析器 –要對字段文本進行索引時,需要將其轉換為最基本的形式。 首先,將它們標記化,然后將其轉換為小寫字母,標記化,去斑點化。 這些任務由分析器執行。 分析儀非常復雜,我們需要深入研究如何使用它們。 大多數情況下,內置分析儀不能滿足我們的要求,在這種情況下,我們可以創建一個新的分析儀。 在本教程中,我們將使用StandardAnalyzer,因為它們包含了我們所需的大多數基本功能。
  • 教程目標

  • 嘗試創建一個Lucene索引。
  • 在其中插入書籍記錄。
  • 在此索引上執行各種搜索。
  • 書名(字符串
  • 圖書作者(字符串)
  • 圖書類別(字符串)
  • #Pages(int)
  • 價格(浮動)
  • 本教程的代碼已提交給SVN。 可以從以下位置檢出: https : //www.assembla.com/code/weblog4j/subversion/nodes/24/SpringDemos/trunk

    這是一個擴展項目,包含更多教程。 lucene類位于com.aranin.spring.lucene包中

  • LuceneUtil –此類包含創建索引,創建IndexWriter和IndexSearcher的實用方法。
  • MySearcherManager –此類使用LuceneUtil并對索引執行搜索。
  • MyWriterManager –此類使用LuceneUtil并對索引執行寫操作。
  • 逐步演練

    1. 依賴關系 –依賴關系可以通過maven添加

    <dependency><artifactId>lucene-core</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-queries</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-queryparser</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-analyzers-common</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency><dependency><artifactId>lucene-facet</artifactId><groupId>org.apache.lucene</groupId><type>jar</type><version>${lucene-version}</version></dependency>

    2. 創建索引 –可以通過在創建模式下創建IndexWriter來創建索引。

    public void createIndex() throws Exception {boolean create = true;File indexDirFile = new File(this.indexDir);if (indexDirFile.exists() && indexDirFile.isDirectory()) {create = false;}Directory dir = FSDirectory.open(indexDirFile);Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);if (create) {// Create a new index in the directory, removing any// previously indexed documents:iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE);}IndexWriter writer = new IndexWriter(dir, iwc);writer.commit();writer.close(true);}
    • indexDir是您要在其中創建索引的目錄。
    • 目錄是用于存儲索引的文件的平面列表。 它可以是RAMDirectory,FSDirectory或基于DB的目錄。
    • FSDirectory實現目錄并將索引保??存在文件系統中的文件中。
    • IndexWriterConfig.Open模式在create或create_append或appned模式下創建編寫器。 如果創建模式不存在或覆蓋現有索引,則創建模式會創建一個新索引。 為了創建目的,我們創建一個現有的。
    • 調用上述方法將創建一個空索引。

    3. 寫入索引 –創建索引后,我們可以向其中寫入文檔。 這可以通過以下方式完成。

    public void createIndexWriter() throws Exception {boolean create = true;File indexDirFile = new File(this.indexDir);Directory dir = FSDirectory.open(indexDirFile);Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43); <span style="color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace; line-height: 21px;">IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_43, analyzer);</span>iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);this.writer = new IndexWriter(dir, iwc);}

    上面的方法在create_append模式下創建一個writer。 在這種模式下,如果創建了索引,則不會覆蓋它。 您可以注意到,此方法不會關閉編寫器。 它只是創建并返回它。 創建IndexWriter是一項昂貴的操作。 因此,我們不應該在每次必須將文檔寫入索引時都創建作者。 相反,我們應該創建一個IndexWriter池,并使用線程系統從池中將寫入器寫入索引,然后將寫入器返回到池中。

    public void addBookToIndex(BookVO bookVO) throws Exception {Document document = new Document();document.add(new StringField("title", bookVO.getBook_name(), Field.Store.YES));document.add(new StringField("author", bookVO.getBook_author(), Field.Store.YES));document.add(new StringField("category", bookVO.getCategory(), Field.Store.YES));document.add(new IntField("numpage", bookVO.getNumpages(), Field.Store.YES));document.add(new FloatField("price", bookVO.getPrice(), Field.Store.YES));IndexWriter writer = this.luceneUtil.getIndexWriter();writer.addDocument(document);writer.commit();}

    插入時,我們不會在代碼中創建編寫器。 取而代之的是,我們使用了一個預先創建的writer,它被存儲為實例變量。

    4. 搜索索引 –這又分兩個步驟完成:1.創建IndexSearcher 2.創建查詢并進行搜索。

    public void createIndexSearcher(){IndexReader indexReader = null;IndexSearcher indexSearcher = null;try{File indexDirFile = new File(this.indexDir);Directory dir = FSDirectory.open(indexDirFile);indexReader = DirectoryReader.open(dir);indexSearcher = new IndexSearcher(indexReader);}catch(IOException ioe){ioe.printStackTrace();}this.indexSearcher = indexSearcher;}

    注–搜索器中使用的分析器應與用于創建編寫器的分析器相同,因為分析器負責將數據存儲在索引中的方式。 再次創建IndexSearcher是一項昂貴的操作,因此預創建IndexSearcher池并以與IndexWriter類似的方式使用它是有意義的。

    public List<BookVO> getBooksByField(String value, String field, IndexSearcher indexSearcher){List<BookVO> bookList = new ArrayList<BookVO>();Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_43);QueryParser parser = new QueryParser(Version.LUCENE_43, field, analyzer);try {BooleanQuery query = new BooleanQuery();query.add(new TermQuery(new Term(field, value)), BooleanClause.Occur.MUST);//Query query = parser.Query(value);int numResults = 100;ScoreDoc[] hits = indexSearcher.search(query,numResults).scoreDocs;for (int i = 0; i < hits.length; i++) {Document doc = indexSearcher.doc(hits[i].doc);bookList.add(getBookVO(doc));}} catch (IOException e) {e.printStackTrace(); }return bookList; }

    已預先創建IndexSearcher并將其傳遞給該方法。 搜索的主要部分是查詢形成。 Lucene支持許多不同種類的查詢器。

  • TermQuery
  • BooleanQuery
  • WildcardQuery
  • PhraseQuery
  • PrefixQuery
  • MultiPhraseQuery
  • FuzzyQuery
  • RegexpQuery
  • TermRangeQuery
  • NumericRangeQuery
  • ConstantScoreQuery
  • DisjunctionMaxQuery
  • MatchAllDocsQuery
  • 您可以為搜索選擇適當的查詢。 可以從此處了解查詢語言的語法: http : //lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf

    資源資源

  • http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.pdf
  • http://lucene.apache.org/core/old_versioned_docs/versions/3_1_0/api/all/org/apache/lucene/index/IndexWriterConfig.OpenMode.html
  • http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/api/all/org/apache/lucene/store/FSDirectory.html
  • https://today.java.net/pub/a/today/2003/07/30/LuceneIntro.html
  • http://www.lucenetutorial.com/lucene-query-syntax.html
  • http://lucene.apache.org/core/4_3_0/core/org/apache/lucene/search/Query.html
  • 摘要

    搜索仍然是任何內容驅動的應用程序的骨干。 傳統的數據庫驅動的搜索功能不是很強大,還有很多不足之處。 因此,需要一種快速,準確且功能強大的搜索解決方案,該解決方案可以輕松地并入應用程序代碼中。 Lucene很好地填補了這一空白,它使搜索變得輕而易舉,并得到強大的搜索算法陣列的支持,例如相關性排名,詞組,通配符,接近度和范圍搜索。 它還具有空間和內存效率。 難怪在Lucene之上構建了如此多的應用程序。 本文旨在提供一個基礎教程,以幫助親愛的讀者使用Lucene入門工具。 還有很多要說的,但是那您不想自己探索嗎?

    參考:通過Weblog4j博客的JCG合作伙伴 Niraj Singh, 使用Apache Lucene 4.3可以輕松進行搜索 。

    翻譯自: https://www.javacodegeeks.com/2013/06/searching-made-easy-with-apache-lucene-4-3.html

    lucene使用3.0.3

    總結

    以上是生活随笔為你收集整理的lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。