Lucene –快速添加索引和搜索功能

什么是Lucene?

Apache LuceneTM是完全用Java編寫的高性能,功能齊全的文本搜索引擎庫。 它是一項適用于幾乎所有需要全文搜索的應用程序的技術,尤其是跨平臺的應用程序。

Lucene可以純文本,整數,索引PDF,Office文檔。 等等。,

Lucene如何啟用更快的搜索?

Lucence創建了一個稱為倒排索引的東西。 通常我們在文檔中映射文檔->術語。 但是,Lucene則相反。 創建索引詞->包含該詞的文檔列表,這使搜索速度更快。

安裝Lucene

Maven依賴

<pre class='brush:xml'><dependency><groupid>org.apache.lucene</groupid><artifactid>lucene-core</artifactid><version>3.0.2</version><type>jar</type><scope>compile</scope>
</dependency>

下載依賴

從http://lucene.apache.org/下載Lucene,并在類路徑中添加lucene-core.jar。

Lucene如何工作?


首先讓我們從底部開始了解圖片-中心。 原始文本用于創建Lucene“文檔”,使用指定的分析器對其進行分析,然后根據字段的Store,TermVector和Analzed屬性將文檔添加到索引中。

接下來,從上到下搜索。 用戶以文本格式指定查詢。 查詢對象是基于查詢文本構建的,執行查詢的結果作為TopDocs返回。

Lucene核心課程

目錄,FSDirectory,RAMDirectory 包含索引的目錄

基于文件系統的索引目錄

基于內存的索引目錄

目錄

indexDirectory = FSDirectory.open(新文件('c:// lucene // nodes'));

索引作家 處理寫入索引– addDocument,updateDocument,deleteDocuments,merge等 IndexWriter writer =新的IndexWriter(indexDirectory,

新的StandardAnalyzer(Version.LUCENE_30),

新的MaxFieldLength(1010101));

IndexSearcher 使用indexReader進行搜索-搜索(查詢,整型) IndexSearcher searcher =新的IndexSearcher(indexDirectory);
文獻 DTO用于索引和搜索 Document document = new Document();
領域 每個文檔包含多個字段。 有2部分,名稱,值。 新字段('id','1',Store.YES,Index.NOT_ANALYZED)
術語 測試一個字。 用于search.2零件。要搜索的字段和要搜索的值 條款term = new Term('id','1');
詢問 所有查詢類型的基礎-TermQuery,BooleanQuery,PrefixQuery,RangeQuery,WildcardQuery,PhraseQuery等。 查詢查詢=新的TermQuery(term);
分析儀 從文本構建令牌,并幫助從文本構建索引詞 新的StandardAnalyzer()

Lucene目錄

目錄–是Lucene在其上運行的數據空間。 它可以是文件系統或內存。

以下是常用的目錄

目錄 描述
FS目錄 基于文件系統的目錄 目錄= FSDirectory.open(文件文件);
//文件->目錄路徑
RAM目錄 基于內存的Lucene目錄 目錄=新的MemoryDirectory()

Directory = new MemoryDirectory(Directory dir)//將基于文件的目錄加載到內存


創建索引條目

Lucene的“文檔”對象是索引中使用的主要對象。 文檔包含多個字段。 分析器在文檔字段上進行工作,以將其分解為令牌,然后使用索引編寫器寫入目錄。

索引作家

IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true, MaxFieldLength.UNLIMITED);

分析儀

將文本分析為要搜索的標記或關鍵字的工作。 Lucene提供的默認分析器很少。 分析器的選擇定義了如何對索引文本進行標記和搜索。

以下是一些標準分析儀。

示例–分析器如何處理示例文本

定義字段索引的屬性

  • 存儲–是否應存儲該字段以便將來檢索
  • 分析–應將內容拆分為令牌
  • TermVECTOR –是否存儲基于術語的詳細信息


店鋪:

是否應將該字段存儲起來以便以后撤退

是的 存儲值,以后可以從索引中檢索
商店編號 不要儲存。 與Index.ANALYZED一起使用。 當令牌僅用于搜索時


分析:

如何分析文字

索引分析 將文本分解為標記,對每個標記編制索引以使其可搜索
索引。NOT_ANALYZED 將整個文本作為單個標記編制索引,但不要進行分析(拆分)
Index.ANALYZED_NO_NORMS 與ANALYZED相同,但不存儲規范
索引:NOT_ANALYZED_NO_NORMS 與NOT_ANALYZED相同,但沒有規范
索引號
使此字段完全可搜索


詞向量

相似,突出顯示等需要術語詳細信息

TermVector.YES 記錄
每個文檔中的唯一條款+計數+無位置+無偏移
TermVector.WITH_POSITIONS 記錄
每個文檔中的唯一條款+計數+位置+無偏移
TermVector.WITH_OFFSETS 記錄
每個文檔中的唯一條款+計數+無位置+抵消
TermVector.WITH_POSITIONS_OFFSETS 記錄
每個文檔中的唯一條款+計數+位置+偏移
TermVector.NO 不要記錄術語向量信息

創建索引的示例

IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);Document document = new Document();
document.add(new Field('id', '1', Store.YES, Index.NOT_ANALYZED));
document.add(new Field('name', 'user1', Store.YES, Index.NOT_ANALYZED));
document.add(new Field('age', '20', Store.YES, Index.NOT_ANALYZED));
writer.addDocument(document);

更新索引的示例

IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), true,MaxFieldLength.UNLIMITED);Document document = new Document();
document.add(new Field("id", "1", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("name", "user1", Store.YES, Index.NOT_ANALYZED));
document.add(new Field("age", "20", Store.YES, Index.NOT_ANALYZED));
writer.addDocument(document);

刪除索引的例子

IndexWriter writer = new IndexWriter(indexDirectory, new StandardAnalyzer(Version.LUCENE_30), MaxFieldLength.UNLIMITED);Term term = new Term('id', '1');
writer.deleteDocuments(term);

搜索索引: 用戶以文本格式指定查詢。 根據查詢文本構建查詢對象,對其進行分析,然后將執行的查詢結果作為TopDocs返回。
查詢是搜索的主要輸入。

術語查詢
布爾查詢 是否(合并多個查詢)

機器生成的替代文本:表36布爾查詢運算符快捷方式詳細語法快捷語法aANDb + a + b aORb ab aNDNOTb + a-b

前綴查詢 以。。開始
通配符查詢 ? 和*
– *開頭不允許
詞組查詢 精確短語
范圍查詢 術語范圍或數字范圍
模糊查詢 相似詞搜索

樣本查詢

搜索示例:

IndexSearcher searcher = new IndexSearcher(indexDirectory);
Term term = new Term('id', '1');
Query query = new TermQuery(term);
TopDocs docs = searcher.search(query, 3);
for (int i = 1; i <= docs.totalHits; i++)
{System.out.println(searcher.doc(i));
}

Lucene診斷工具:

  • 盧克– http://code.google.com/p/luke/
    Luke是一個方便的開發和診斷工具,它可以訪問現有的Lucene索引,并允許您以幾種方式顯示和修改其內容:
  • 豪華轎車– http://limo.sourceforge.net/
    這個想法是要有一個小的工具作為Web應用程序運行,它提供有關Lucene搜索引擎使用的索引的基本信息。

完整的例子:

在這里下載: LuceneTester.java

資源資源

  • http://lucene.apache.org/core/
  • http://www.amazon.com/Lucene-Action-Second-Edition-Covers/dp/1933988177/ref=dp_ob_title_bk

參考: Lucene –在Techie博客的Thoughts中,從我們的JCG合作伙伴 Srividhya Umashanker 快速添加了索引和搜索功能 。

翻譯自: https://www.javacodegeeks.com/2012/12/lucene-quickly-add-index-and-search-capability.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

td 雙擊 編輯 php,雙擊表格td進行編輯

$(function(){//隔行換色// $("tbody tr:odd").css("background-color","#eee");var numId $(".tbody td");numId.dblclick(function(){var tdIns $(this);var tdpar $(this).parents("tr");//tdpar.remove();//current_…

前端開發之基礎知識-HTML(一)

1.1 html概述和基本結構 html概述 HTML是 HyperText Mark-up Language 的首字母簡寫&#xff0c;意思是超文本標記語言&#xff0c;超文本指的是超鏈接&#xff0c;標記指的是標簽&#xff0c;是一種用來制作網頁的語言&#xff0c;這種語言由一個個的標簽組成&#xff0c;用…

nodejs的async異步編程

函數有&#xff1a; series waterfall parallel parallelLimit … series函數 串行執行 它的作用就是按照順序一次執行。 async.series({ one: function(callback){ callback(null, 1); }, two: function(callback){ callback(null, 2); } },function(err, results) { conso…

《深入理解Java虛擬機》讀書筆記3--垃圾回收算法

轉載&#xff1a;http://blog.csdn.net/tjiyu/article/details/53983064 下面先來了解Java虛擬機垃圾回收的幾種常見算法&#xff1a;標記-清除算法、復制算法、標記-整理算法、分代收集算法、火車算法&#xff0c;介紹它們的算法思路&#xff0c;有什么優點和缺點&#xff0c;…

python常用函數中文_【python】python常用函數

urlencode與urldecode當url中包含中文或者參數包含中文&#xff0c;需要對中文或者特殊字符(/、&)做編碼轉換。urlencode的本質&#xff1a;把字符串轉為gbk編碼&#xff0c;再把\x替換成%。如果終端是utf8編碼的&#xff0c;需要把結果再轉成utf8輸出&#xff0c;否則會亂…

帶有批注的Spring硒測試

這篇文章描述了如何在Java中實現Selenium測試。 它的靈感來自Alex Collins的帖子&#xff0c;并帶有注釋。 該代碼可在GitHub的Spring-Selenium-Test目錄中找到。 一些替代方法和更輕巧的技術可用于對Spring MVC應用程序進行單元測試。 要進行單元測試服務&#xff0c;請參見此…

sizeof運算符

sizeof是一個單目運算符&#xff0c;它的運算對象是變量或數據類型&#xff0c;運算結果為一個整數。運算的一般形式如下: sizeof(<類型或變量名>) 它只針對數據類型&#xff0c;而不針對變量&#xff01; 若運算對象為變量&#xff0c;則所求的結果是這個變量占用的內存…

oracle 日志切換太頻繁,診斷一次Oracle日志切換頻繁的問題

日志切換&#xff0c;就是生成的日志太大&#xff0c;數據塊的變化太頻繁。Snap IdSnap TimeSessionsCursors/SessionBegin Snap:1456009-Dec-15 04:00:48594.5End Snap:1456109-Dec-15 05:00:59544.6Elapsed:60.19 (mins)DB Time:82.47 (mins)1s產生2M的日志。Per SecondPer T…

Flex布局(一)flex-direction

采用Flex布局的元素&#xff0c;被稱為Flex容器(flex container)&#xff0c;簡稱"容器"。其所有子元素自動成為容器成員&#xff0c;成為Flex項目(Flex item)&#xff0c;簡稱"項目" Flex-direction調整主軸方向&#xff08;默認為水平方向&#xff09;包…

【升級版】如何使用阿里云云解析API實現動態域名解析,搭建私有服務器【含可執行文件和源碼】...

原文地址&#xff1a;http://www.yxxrui.cn/article/179.shtml 未經許可請勿轉載&#xff0c;如有疑問&#xff0c;請聯系作者&#xff1a;yxxrui163.com 我遇到的問題&#xff1a;公司的網絡沒有固定的公網IP地址&#xff0c;但是需要能夠保證的是&#xff0c;每次動態分配的I…

Java管理擴展

什么是JMX&#xff1f; Java管理擴展&#xff08;JMX&#xff09;是一種API&#xff0c;用于管理或監視各種資源&#xff0c;例如應用程序&#xff0c;設備&#xff0c;服務&#xff0c;當然還有JVM。 通過Java社區流程&#xff08;JCP&#xff09;開發&#xff0c;JMX技術被構…

登錄網頁后要彈出一個新標簽_連永久鏈接都不會,還做什么新媒體?

上次給主編大大發的預覽鏈接失效了&#xff0c;被罵得狗血淋頭。大部分運營人可能都遇到過這種情況&#xff0c;忽視了預覽生成的鏈接只是臨時的&#xff0c;在12小時后或超過500閱讀量后就會失效。一個疏忽&#xff0c;給自己帶來了不必要的麻煩&#xff0c;耽誤工作&#xff…

混頻通信的matlab仿真,基于MATLAB的擴頻通信系統仿真研究—上海交通大學

基于MATLAB 的擴頻通信系統仿真研究范偉 翟傳潤 戰興群(上海交通大學電子信息與電氣工程學院&#xff0c;200030&#xff0c;上海)摘要 本文闡述了擴展頻譜通信技術的理論基礎和實現方法&#xff0c;利用MATLAB 提供的可視化工具Simulink 建立了擴頻通信系統仿真模型&#xff0…

static_cast與dynamic_cast轉換

static_cast與dynamic_cast轉換   一 C語言中存在著兩種類型轉換&#xff1a; 隱式轉換和顯式轉換 隱式轉換&#xff1a;不同數據類型之間賦值和運算&#xff0c;函數調用傳遞參數……編譯器完成 char ch;int i ch; 顯示轉換&#xff1a;在類型前增加 &#xff1a;&#xff…

vue使用iview Timeline 時間軸不顯示問題

vue Timeline 時間軸不顯示渲染的效果 官網代碼 <Timeline pending><TimelineItem>發布1.0版本</TimelineItem><TimelineItem>發布2.0版本</TimelineItem><TimelineItem>發布3.0版本</TimelineItem><TimelineItem><a href…

python 重置索引_python pandas 對series和dataframe的重置索引reindex方法

reindex更多的不是修改pandas對象的索引&#xff0c;而只是修改索引的順序&#xff0c;如果修改的索引不存在就會使用默認的None代替此行。且不會修改原數組&#xff0c;要修改需要使用賦值語句。series.reindex()import pandas as pdimport numpy as npobj pd.Series(range(4…

Java EE 6 Web配置文件。 在云上。 簡單。

Java SE還可以。 Java EE是邪惡的。 這就是我一直想的。 好吧&#xff0c;現在不再了。 讓我分享我的經驗。 幾周前&#xff0c;我開始考慮將舊版spring hibernate tomcat應用程序移植到新平臺上&#xff1a; SAP NetWeaver云 。 我知道您在極客那里的想法&#xff1a;…

Kubernetes核心概念總結

1、基礎架構 1.1 Master Master節點上面主要由四個模塊組成&#xff1a;APIServer、scheduler、controller manager、etcd。 APIServer。APIServer負責對外提供RESTful的Kubernetes API服務&#xff0c;它是系統管理指令的統一入口&#xff0c;任何對資源進行增刪改查的操作都要…

七、spring boot 1.5.4 集成shiro+cas,實現單點登錄和權限控制

1.安裝cas-server-3.5.2 官網&#xff1a;https://github.com/apereo/cas/releases/tag/v3.5.2 下載地址&#xff1a;cas-server-3.5.2-release.zip 安裝參考文章&#xff1a;http://blog.csdn.net/xuxuchuan/article/details/54924933 注意&#xff1a; 輸入 <tomcat_key&g…

php連接mysql數據,php連接mysql數據庫

$sql_link mysql_connect("主機名","登入用戶名","登入用戶名密碼");如果連接成功&#xff0c;就會返回一個mysql句柄,可以簡單的理解成這個$sql_link 是php跟mysql的一個橋梁&#xff0c;通過該橋梁我們可以進入到mysql。進入到mysql之后&…