几百行代码完成百度搜索引擎,真的可以吗?(下)

简介: Hello 大家好,我是鸭血粉丝,大家都叫我阿粉,搜索引擎想必大家一定不会默认,我们项目中经常使用的 ElasticSearch 就是一种搜索引擎,在我们的日志系统中必不可少,ELK 作为一个整体,基本上是运维标配了,另外目前的搜索引擎底层都是基于 Lucene 来实现的。

进入过后,我们可以看到下图显示的内容,选择 content 点击 show top items 可以看到右侧的索引数据,这里根据分词器的不同,索引的结果是不一样的,阿粉这里采用的分词器就是标准的分词器,小伙伴们可以根据自己的要求选择适合自己的分词器即可。

32.jpg

搜索数据

数据已经索引成功了,接下来我们就需要根据条件进行数据的搜索了,我们创建一个 LuceneSearchUtil.java 来操作数据。

import org.apache.commons.collections.MapUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.springframework.beans.factory.annotation.Value;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Map;
public class LuceneSearchUtil {
    private static String INDEX_PATH = "/opt/lucene/demo";
    private static IndexSearcher searcher;
    public static LuceneSearchUtil getInstance() {
        return LuceneSearchUtil.SingletonHolder.searchUtil;
    }
    private static class SingletonHolder {
        public final static LuceneSearchUtil searchUtil = new LuceneSearchUtil();
    }
    private LuceneSearchUtil() {
        this.initSearcher();
    }
    private void initSearcher() {
        Directory directory;
        try {
            directory = FSDirectory.open(Paths.get(INDEX_PATH));
            DirectoryReader reader = DirectoryReader.open(directory);
            searcher = new IndexSearcher(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public TopDocs searchByMap(Map<String, Object> queryMap) throws Exception {
        if (null == searcher) {
            this.initSearcher();
        }
        if (MapUtils.isNotEmpty(queryMap)) {
            BooleanQuery.Builder builder = new BooleanQuery.Builder();
            queryMap.forEach((key, value) -> {
                if (value instanceof String) {
                    Query queryString = new PhraseQuery(key, (String) value);
//                    Query queryString = new TermQuery(new Term(key, (String) value));
                    builder.add(queryString, BooleanClause.Occur.MUST);
                }
            });
            return searcher.search(builder.build(), 10);
        }
        return null;
    }
}

在 demo.java 中增加搜索代码如下:

//查询数据
   Map<String, Object> map = new HashMap<>();
   map.put("title", "Java 极客技术");
//   map.put("title", "极客技术");
//   map.put("content", "最");
   LuceneSearchUtil searchUtil = LuceneSearchUtil.getInstance();
   TopDocs topDocs = searchUtil.searchByMap(map);
   System.out.println(topDocs.totalHits);

运行结果如下,表示搜索到了两条。

33.jpg

通过可视化工具我们可以看到 title 为"Java 极客技术"确实是有两条记录,而且我们也确认只插入了两条数据。注意这里如果根据其他字符去查询可能查询不出来,因为阿粉这里的分词器采用的是默认的分词器,小伙伴可以根据自身的情况采用相应的分词器。

34.jpg

至此我们可以索引和搜索数据了,不过这还是简单的入门操作,对于不同类型的字段,我们需要使用不同的查询方式,而且根据系统的特性我们需要使用特定的分词器,默认的标准分词器不一定符合我们的使用场景。而且我们索引数据的时候也需要根据字段类型进行不同 Field 的设定。上面的案例只是 demo 并不能在生产上使用,搜索引擎在互联网行业是领头羊,很多先进的互联网技术都是从搜索引擎开始发展的。

相关的代码阿粉已经放到 GitHub 上了,公众号回复【源码仓库】即可获得。

相关文章
|
2月前
|
人工智能 缓存 搜索推荐
百度/Bing/Google搜索引擎使用技巧
本文分享了百度、Bing和Google三大搜索引擎的实用技巧,涵盖精确匹配、排除关键词、站内及文件类型搜索等,如使用双引号进行精确搜索“人工智能应用”,排除特定词如“人工智能 -游戏”,以及在特定网站如“site:baidu.com 人工智能”内查找内容等,帮助提高搜索效率和准确性。
百度/Bing/Google搜索引擎使用技巧
|
搜索推荐 定位技术 SEO
自建网站写博客,怎么被百度等搜索引擎搜到?
自从本站openGPS.cn增加博客板块,也有一段时间了,通过这段时间的学习积累,意识到自建网站发布博客,中间要经历的几件事情: 1,百度搜索,360搜索,搜狗搜索等国内搜索引擎好久搜不到自己的网站。
1984 0
|
运维 搜索推荐 数据可视化
几百行代码完成百度搜索引擎,真的可以吗?(上)
Hello 大家好,我是鸭血粉丝,大家都叫我阿粉,搜索引擎想必大家一定不会默认,我们项目中经常使用的 ElasticSearch 就是一种搜索引擎,在我们的日志系统中必不可少,ELK 作为一个整体,基本上是运维标配了,另外目前的搜索引擎底层都是基于 Lucene 来实现的。
几百行代码完成百度搜索引擎,真的可以吗?(上)
|
搜索推荐 SEO
怎么发帖可以让搜索引擎(百度)尽快收录?
帖子的内容需要注意的要点: 1、内容中需要带有站点的名称,并把这个站点的名称作为文字链接,连向你的主域名。如:SEO十万个为什么 。这个概念叫:Anchor Text,中文:链接锚文本
195 0
|
搜索推荐
百度网盘搜索引擎
百度网盘搜索 百度网盘搜索是国内老牌的百度网盘搜索引擎,也是百度网盘,百度云盘搜索。 百度网盘搜索是基于百度云搜索,最大的百度网盘资源搜索中心,千万级数据量,让您一网打尽所有的百度网盘资源. http://pan.codedq.net/福利!福利!百度网盘搜索功能全新上线!支持百度网盘搜索功能。搜片,搜资料,一网打尽! 喜欢的朋友可以添加收藏! http://pan.codedq.net/
9370 1
|
自然语言处理 搜索推荐 算法
海量数据搜索---demo展示百度、谷歌搜索引擎的实现
百度、谷歌等网站之所以能很快在海量数据中找到需要的数据,得益于其搜索引擎,本文将介绍搜索引擎的基本知识及中文分词的方法,并通过demo演示如何进行数据检索。
|
数据采集 搜索推荐 前端开发
fbh
|
Web App开发 编解码 搜索推荐
禁止百度,神马,搜狗等搜索引擎转码
百度 第一种,HTTP Response中显式声明Cache-control为no-transform。 第二种,meta标签中显式声明Cache-control为no-tranform,格式为: 神马 第一种. HTTP Response中显式声明Cache-control为no-siteapp。
fbh
2359 0
|
运维 负载均衡 搜索推荐
支撑百度搜索引擎99.995%可靠名字服务架构设计
百度搜索引擎是全球最大的中文搜索引擎,致力于向人们提供"简单,可依赖"的信息获取方式。百度网页搜索部架构师郑然为我们分享支撑百度搜索引擎的可靠名字服务架构设计。
3589 0