springboot6==ElasticSearch基础 LUCENE7 demo

springboot6==ElasticSearch基础 LUCENE7 demo,第1张

springboot6==ElasticSearch基础 LUCENE7 demo

感谢这篇文章,让我一下就看懂了,牛皮:

搜索引擎技术系列教材 (一)- lucene - Lucene7 入门;Lucene,概念,Lucene,这个开源项目,使得,Java开发人员可以很方便地得到像搜索引擎google,baidu那样的搜索效果。;先运行,看到效果,再学习,老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。,运行TestLucene类,期望看...https://how2j.cn/k/search-engine/search-engine-intro/1672.html?p=42551===============================================================

 步骤:

1、IDEA新建一个java项目结构

2、导入项目依赖到lib文件夹中后需要右键lib文件夹,选择添加为项目依赖

 3、代码

package com.ldj.demo;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexableField;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class TestLucene {

	public static void main(String[] args) throws Exception {
		// 1. 准备中文分词器
		IKAnalyzer analyzer = new IKAnalyzer();

		// 2. 索引
		List productNames = new ArrayList<>();
		productNames.add("飞利浦led灯泡e27螺口暖白球泡灯家用照明超亮节能灯泡转色温灯泡");
		productNames.add("飞利浦led灯泡e14螺口蜡烛灯泡3W尖泡拉尾节能灯泡暖黄光源Lamp");
		productNames.add("雷士照明 LED灯泡 e27大螺口节能灯3W球泡灯 Lamp led节能灯泡");
		productNames.add("飞利浦 led灯泡 e27螺口家用3w暖白球泡灯节能灯5W灯泡LED单灯7w");
		productNames.add("飞利浦led小球泡e14螺口4.5w透明款led节能灯泡照明光源lamp单灯");
		productNames.add("飞利浦蒲公英护眼台灯工作学习阅读节能灯具30508带光源");
		productNames.add("欧普照明led灯泡蜡烛节能灯泡e14螺口球泡灯超亮照明单灯光源");
		productNames.add("欧普照明led灯泡节能灯泡超亮光源e14e27螺旋螺口小球泡暖黄家用");
		productNames.add("聚欧普照明led灯泡节能灯泡e27螺口球泡家用led照明单灯超亮光源");		
		Directory index = createIndex(analyzer, productNames);

		// 3. 查询器
		String keyword = "护眼带光源";
		Query query = new QueryParser("name", analyzer).parse(keyword);
		

		// 4. 搜索
		IndexReader reader = DirectoryReader.open(index);
		IndexSearcher searcher = new IndexSearcher(reader);
		int numberPerPage = 1000;
		System.out.printf("当前一共有%d条数据%n",productNames.size());
		System.out.printf("查询关键字是:"%s"%n",keyword);
		ScoreDoc[] hits = searcher.search(query, numberPerPage).scoreDocs;

		// 5. 显示查询结果
		showSearchResults(searcher, hits, query, analyzer);
		// 6. 关闭查询
		reader.close();
	}

	private static void showSearchResults(IndexSearcher searcher, ScoreDoc[] hits, Query query, IKAnalyzer analyzer)
			throws Exception {
		System.out.println("找到 " + hits.length + " 个命中.");
		System.out.println("序号t匹配度得分t结果");
		for (int i = 0; i < hits.length; ++i) {
			ScoreDoc scoreDoc= hits[i];
			int docId = scoreDoc.doc;
			document d = searcher.doc(docId);
			List fields = d.getFields();
			System.out.print((i + 1));
			System.out.print("t" + scoreDoc.score);
			for (IndexableField f : fields) {
				System.out.print("t" + d.get(f.name()));
			}
			System.out.println();
		}
	}

	private static Directory createIndex(IKAnalyzer analyzer, List products) throws IOException {
		Directory index = new RAMDirectory();
		IndexWriterConfig config = new IndexWriterConfig(analyzer);
		IndexWriter writer = new IndexWriter(index, config);

		for (String name : products) {
			addDoc(writer, name);
		}
		writer.close();
		return index;
	}

	private static void addDoc(IndexWriter w, String name) throws IOException {
		document doc = new document();
		doc.add(new TextField("name", name, Field.Store.YES));
		w.adddocument(doc);
	}
}

4、运行main方法查看效果

============================================

总结:

1、为什么Lucene会比数据库快?因为它将数据存在内存中,查也从内存里查,自然就比数据库里快多了,比如mysql数据库本质是将数据存为文件保存在电脑硬盘上,CRUD都需要IO,而计算机IO是非常耗时的因为要和物理设备打交道。 

2、like 也可以进行查询,那么使用lucene 的方式有什么区别呢? 主要是两点:         
        1. 相关度
通过观察运行结果,可以看到不同相关度的结果都会查询出来,但是使用 like,就做不到这一点了
        2. 性能
数据量小的时候,like 也会有很好的表现,但是数据量一大,like 的表现就差很多了。 

3、分词器指的是搜索引擎如何使用关键字进行匹配,如 入门 中的关键字:护眼带光源。 如果使用like,那么%护眼带光源%,匹配出来的结果就是要么全匹配,要不都不匹配。而使用分词器,就会把这个关键字分为 护眼,带,光源 3个关键字,这样就可以找到不同相关程度的结果了。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5574005.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存