1. 程式人生 > >lucene全文搜尋之三:生成索引欄位,建立索引文件(給索引欄位加權)基於lucene5.5.3

lucene全文搜尋之三:生成索引欄位,建立索引文件(給索引欄位加權)基於lucene5.5.3

前言:上一章中我們已經實現了索引器的建立,但是我們沒有索引文件,本章將會講解如何生成欄位、建立索引文件,給欄位加權以及儲存文件到索引器目錄

一、建立索引文件

一個索引目錄可以放多個索引文件,每個索引文件多個索引欄位組成,索引欄位由要索引的欄位名欄位內容以及權重值組成

1、構建索引欄位並加權

/**
	 * 建立索引欄位
	 * @param boost
	 *            -權重值
	 * @param fieldName
	 *            - 欄位名
	 * @param statement
	 *            -內容
	 * @param fieldType
	 *            -欄位儲存型別
	 * @return
	 */
	public Field createField(String fieldName, String statement, FieldType fieldType, Float boost) {
		Field field = null;
		if (fieldName != null && statement != null && fieldType != null) {
			field = new Field(fieldName, statement, fieldType);
			if (boost != null) {
				field.setBoost(boost);
			}
		}
		return field;
	}

	/**
	 * 建立索引欄位
	 * 
	 * @param fieldName
	 * @param reader
	 * @param type
	 * @param boost
	 * @return
	 */
	public Field createField(String fieldName, Reader reader, FieldType type, Float boost) {
		Field field = null;
		if (fieldName != null && reader != null) {
			field = new Field(fieldName, reader, type);
			if (boost != null) {
				field.setBoost(boost);
			}
		}
		return field;
	}

	/**
	 * 建立索引欄位
	 * 
	 * @param fieldName
	 * @param tokenStream
	 * @param type
	 * @param boost
	 * @return
	 */
	public Field createField(String fieldName, TokenStream tokenStream, FieldType type, Float boost) {
		Field field = null;
		if (fieldName != null && tokenStream != null) {
			field = new Field(fieldName, tokenStream, type);
			if (boost != null) {
				field.setBoost(boost);
			}
		}
		return field;
	}

	/**
	 * 建立索引欄位
	 * 
	 * @param fieldName
	 * @param value
	 * @param type
	 * @param boost
	 * @return
	 */
	public Field createField(String fieldName, byte[] value, FieldType type, Float boost) {
		return value != null ? createField(fieldName, value, 0, value.length, type, boost) : null;
	}

	/**
	 * 建立索引欄位
	 * 
	 * @param fieldName
	 * @param value
	 * @param offset
	 * @param length
	 * @param type
	 * @param boost
	 * @return
	 */
	public Field createField(String fieldName, byte[] value, int offset, int length, FieldType type, Float boost) {
		Field field = null;
		if (fieldName != null && value != null && type != null) {
			field = new Field(fieldName, value, offset, length, type);
			if (boost != null) {
				field.setBoost(boost);
			}
		}
		return field;
	}

2、建立索引文件

/**
	 * 建立索引文件
	 * 
	 * @return
	 */
	public Document createDocument() {
		return new Document();
	}

二、新增欄位到索引文件

	/**
	 * 把欄位存放到索引文件
	 * 
	 * @param document
	 * @param field
	 * @return
	 */
	public Document addFiled(Document document, Field field) {
		if (field != null) {
			document.add(field);
		}
		return document;
	}
	/**
	 * 批量存放欄位到索引文件
	 * @param document
	 * @param fields
	 * @return
	 */
	public Document addFiledList(Document document, Field... fields) {
		if (fields != null && fields.length > 0) {
			for (Field field : fields) {
				document.add(field);
			}
		}
		return document;
	}


三、給索引器新增索引文件

使用上一章中的方法把生成的文件新增到索引中

事實上我們常把索引文件根據不同分類儲存到不同的索引目錄,再搜尋時可以根據不同索引目錄進行搜尋。

例如:

	Analyzer analyzer=createAnalyzer(false);
	
	Directory dir=createDirectory(null, "d:","dir","search");
	
	IndexWriterConfig conf=createIndexConf(analyzer, OpenMode.CREATE_OR_APPEND, false);
	IndexWriter index=createIndex(dir, conf);
	
	//建立一個文件
	Document doc=createDocument();
	 String[] states = new String[] {"歡迎來到eguid的部落格", "歡迎大家來到eguid的技術部落格", "歡迎大家來到eguid的技術部落格,很開心能和大家一起分享開源技術"};
	//建立欄位
	Field[] fields=createFields("欄位名", states, TextField.TYPE_STORED, 1.1f);
	//批量增加欄位到索引文件
	addFiledList(doc, fields);
	//把索引文件儲存到索引器
	index.addDocument(doc);
這樣就把添加了一個索引,想要搜尋這個索引,那麼接下來讓我們建立搜尋器吧

相關推薦

lucene全文搜尋生成索引建立索引索引加權基於lucene5.5.3

前言:上一章中我們已經實現了索引器的建立,但是我們沒有索引文件,本章將會講解如何生成欄位、建立索引文件,給欄位加權以及儲存文件到索引器目錄 一、建立索引文件 一個索引目錄可以放多個索引文件,每個索引

Lucene學習總結Lucene索引檔案格式(2)

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Spring系列SpringBean的單例構造和多例構造Maven Idea

在使用Spring的Ioc容器建立物件會使用到單例構造或多例構造;單例構造:整個程式只有一個物件多例構造:程式中有類例項的多個物件,物件之間互相獨立首先在Test包下面建立一個User類,原始碼如下;package com.lydetails.ssm.Test; public

第九篇 用spring boot整合swagger2建立API

簡介: Swagger的目標是為REST APIs 定義一個標準的,與語言無關的介面,使人和計算機在看不到原始碼或者看不到文件或者不能通過網路流量檢測的情況下能發現和理解各種服務的功能。當服務通過Swagger定義,消費者就能與遠端的服務互動通過少量的實現邏輯。類似於低階程

Orleans 2.0官方閆輝的個人翻譯——2.3 示例Adventure

Adventure 一款簡單的多人文字冒險遊戲,靈感來自老式的,基於文字的冒險遊戲。 說明 在Visual Studio中開啟OrleansAdventure.sln。在這裡可以找到。 啟動“AdventureSetup”專案。 一旦AdventureSetup執行,啟

Orleans 2.0官方閆輝的個人翻譯——2.1 入門教程1Orleans基礎

教程1—— 建立一個極小的Orleans應用程式 本教程提供了有關建立基本功能的Orleans應用程式的分步說明。它被設計為自包含且極盡簡約,具有以下特徵: 它僅依賴於NuGet包 它已在使用Orleans 2.2.0的Visual Studio 2017中進行了測試

藍的成長記——追逐DBA4追憶少年情愁再探oracle安裝Linux下10g、11g

***************************************宣告***************************************         個人在oracle路上的成長記錄,其中以藍自喻,分享成長中的情感、眼界與技術的變化與成長。敏

Lucene全文檢索倒排索引實現原理、API解析【2018.11】

》 官網 http://lucene.apache.org/ 下載地址:https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/java/7.5.0/ 》 Lucene的全文檢索是指什麼: 程式掃描文件

Lucene學習總結Lucene搜尋過程解析

2.4、搜尋查詢物件 2.4.4、收集文件結果集合及計算打分 在函式IndexSearcher.search(Weight, Filter, int) 中,有如下程式碼: TopScoreDocCollector collector = TopScoreDocCollector.create

Lucene學習總結Lucene搜尋過程解析(1)

一、Lucene搜尋過程總論 搜尋的過程總的來說就是將詞典及倒排表資訊從索引中讀出來,根據使用者輸入的查詢語句合併倒排表,得到結果文件集並對文件進行打分的過程。 其可用如下圖示: 總共包括以下幾個過程: IndexReader開啟索引檔案,讀取並開啟指向索引檔案的流。

Lucene學習總結Lucene搜尋過程解析(7)轉

2.4、搜尋查詢物件 2.4.3.2、並集DisjunctionSumScorer(A OR B) DisjunctionSumScorer中有成員變數List<Scorer> subScorers,是一個Scorer的連結串列,每一項代表一個倒排表,Dis

Lucene學習總結Lucene搜尋過程解析(5)

2.4、搜尋查詢物件 2.4.3、進行倒排表合併 在得到了Scorer物件樹以及SumScorer物件樹後,便是倒排表的合併以及打分計算的過程。 合併倒排表在此節中進行分析,而Scorer物件樹來進行打分的計算則在下一節分析。 BooleanScorer2.score(C

Lucene學習總結Lucene搜尋過程解析(3)

2.3、QueryParser解析查詢語句生成查詢物件 程式碼為: QueryParser parser = new QueryParser(Version.LUCENE_CURRENT, "contents", new StandardAnalyzer(Version.LUCENE_CURRENT));

Lucene學習總結Lucene搜尋過程解析(1)轉

一、Lucene搜尋過程總論 搜尋的過程總的來說就是將詞典及倒排表資訊從索引中讀出來,根據使用者輸入的查詢語句合併倒排表,得到結果文件集並對文件進行打分的過程。 其可用如下圖示: 總共包括以下幾個過程: IndexReader開啟索引檔案,讀取並開啟指向索引檔案的流。

elasticsearch實戰三部曲搜尋操作

本文是《elasticsearch實戰三部曲》的終篇,作為elasticsearch的核心功能,搜尋的重要性不言而喻,今天的實戰都會圍繞搜尋展開; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文

mysql索引索引使用注意規則索引失效--存在索引但不使用索引*

使用索引時,有以下一些技巧和注意事項: (1)越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和CPU快取中都需要更少的空間,處理起來更快。(2)簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更復雜。在MySQL中,應該用內建的日期和時間資料型別,而不是用字串來儲存時間;以及用整

Lucene學習總結Lucene索引過程分析

3、將文件加入IndexWriter 程式碼: writer.addDocument(doc);  -->IndexWriter.addDocument(Document doc, Analyzer analyzer)       -->doFlush = docWrite

自動化測試系列使用Katalon Recorder自動生成基於Selenium框架的測試程式碼

系列連結 介紹 上一節說到有人提議用Selenium IDE,本人親自試用了一下,發現不太好用,一是因為它不能export出程式碼,二是輸入的引數是寫死的,比如現在我輸入的是hello world,可能我下次使用的時候,需要輸入ABCD, 那是不是需要手工的去

Lucene學習總結Lucene索引過程分析(1)

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

VCSA 6.5 HA配置 準備工作

vmware vcenter ha 高可用 vcsa 接著上一篇文章部署完成VCSA 6.5後,還需要做一些準備工作才能開啟高可用功能,本篇文章主要就講述如何為vCenter 高可用進行準備工作配置vCenter HA網絡從vCenter HA的架構圖中可以看出對於vCenter HA的高