springboot6==ElasticSearch基础 LUCENE7 demo从14万条商品数据中找出相关度最高的10条数据

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

搜索引擎技术系列教材 (四)- lucene - 向Lucene中导入14万条产品数据

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

内容:

14万条原始数据存储在TXT中,取出后存到list中,通过 LUCENE利用list中数据建立索引,将索引存在Directory中,然后找出匹配度最高的10条数据。

主要代码:

package com.how2java;

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

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. 索引
        Directory index = createIndex(analyzer);

        // 3. 查询器

        Scanner s = new Scanner(System.in);

        while (true) {
            System.out.print("请输入查询关键字:");
            String keyword = s.nextLine();
            System.out.println("当前关键字是:" + keyword);
            Query query = new QueryParser("name", analyzer).parse(keyword);

            // 4. 搜索出10条相关的内容
            IndexReader reader = DirectoryReader.open(index);
            IndexSearcher searcher = new IndexSearcher(reader);
            int numberPerPage = 10;
            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 + " 个命中.");

        SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
        Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(query));


        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<IndexableField> fields = d.getFields();
            //命中的第几条
            System.out.print((i + 1));
            //匹配度得分
            System.out.print("\t" + scoreDoc.score);
            System.out.print("内容");
            //命中的内容详情
            for (IndexableField f : fields) {
                if ("name".equals(f.name())) {
                    TokenStream tokenStream = analyzer.tokenStream(f.name(), new StringReader(d.get(f.name())));
                    String fieldContent = highlighter.getBestFragment(tokenStream, d.get(f.name()));
                    System.out.print("\t" + fieldContent);
                } else {
                    System.out.print("\t" + d.get(f.name()));
                }
            }
            System.out.println("<br>");
        }
    }

    /**
     * 做 Lucene的思路。
     * 1. 首先搜集数据,从TXT中读取14万条数据
     * 数据可以是文件系统,数据库,网络上,手工输入的,或者像本例直接写在内存上的
     * 2. 通过数据创建索引
     * 3. 用户输入关键字
     * 4. 通过关键字创建查询器
     * 5. 根据查询器到索引里获取数据
     * 6. 然后把查询结果展示在用户面前
     * Directory,可以理解为存在内存中的“数据库”,将Document存在Directory中
     */
    private static Directory createIndex(IKAnalyzer analyzer) throws IOException {
        Directory index = new RAMDirectory();
        IndexWriterConfig config = new IndexWriterConfig(analyzer);
        IndexWriter writer = new IndexWriter(index, config);
        String fileName = "E:\\ideaMyProject\\demo-LUCENE\\demo3_14w\\140k_products.txt";
        //14万条数据存入list集合中
        List<Product> products = ProductUtil.file2list(fileName);
        int total = products.size();
        int count = 0;
        int per = 0;
        int oldPer = 0;
        for (Product p : products) {
            //创建索引
            addDoc(writer, p);
            count++;
            per = count * 100 / total;
            if (per != oldPer) {
                oldPer = per;
                System.out.printf("索引中,总共要添加 %d 条记录,当前添加进度是: %d%% %n", total, per);
            }

        }
        writer.close();
        return index;
    }

    /**
     * Directory,可以理解为存在内存中的“数据库”,将Document存在Directory中
     */
    private static void addDoc(IndexWriter w, Product p) throws IOException {
        Document doc = new Document();
        doc.add(new TextField("id", String.valueOf(p.getId()), Field.Store.YES));
        doc.add(new TextField("name", p.getName(), Field.Store.YES));
        doc.add(new TextField("category", p.getCategory(), Field.Store.YES));
        doc.add(new TextField("price", String.valueOf(p.getPrice()), Field.Store.YES));
        doc.add(new TextField("place", p.getPlace(), Field.Store.YES));
        doc.add(new TextField("code", p.getCode(), Field.Store.YES));
        w.addDocument(doc);
    }
}

测试查找"鞋子"相关的10条数据,神奇~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这份资源是一个基于SpringBoot+Vue的基于协同过滤算法商品推荐系统的完整开发源码,包括前端、后端、数据库等部分。该系统是一个电商推荐系统,通过协同过滤算法提供个性化的商品推荐服务。该系统支持用户的注册、登录、浏览商品等基本功能,同时还有个性化推荐、热门商品推荐、商品搜索等辅助功能。 为了更好地使用本资源,我们提供了详细的部署说明和系统介绍。在部署说明,我们详细介绍了如何将本资源部署到本地或远程服务器上,并配置相关环境参数。在系统介绍,我们对协同过滤算法商品推荐系统的业务功能、前后端框架和技术栈等方面进行了详细介绍和解释,以帮助开发者更好地理解系统的设计思路和功能实现。 对于想要深入学习和了解源码的开发者,我们还提供了源码解释。通过逐行分析源码,我们对系统的技术实现、API设计、业务逻辑等进行深入解读和分析,帮助开发者更好地理解源码和在其基础上进行二次开发,并提供更多开发思路和技巧。 总之,本资源适合对SpringBoot、Vue、协同过滤算法、电商推荐系统开发有一定基础的开发者学习和参考。协同过滤算法商品推荐系统的设计思路、技术实现和业务逻辑等方面都具有参考价值,为开发者提供了实践和实现个性化商品推荐的宝贵经验和思路。此外,该系统还可以拓展到其他领域的协同过滤算法推荐系统,扩展应用领域。
这里提供一个基于 ElasticsearchJava demo,可实现效分页查询 10 万条数据: ```java import org.apache.http.HttpHost; import org.elasticsearch.action.ActionListener; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.unit.TimeValue; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.elasticsearch.search.builder.SearchSourceBuilder; import java.io.IOException; public class ElasticsearchDemo { public static void main(String[] args) throws IOException { RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"))); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchAllQuery()); sourceBuilder.from(0); sourceBuilder.size(10000); sourceBuilder.timeout(new TimeValue(60, TimeValue.Unit.SECONDS)); SearchRequest searchRequest = new SearchRequest(); searchRequest.indices("your_index_name"); searchRequest.source(sourceBuilder); client.searchAsync(searchRequest, new ActionListener<SearchResponse>() { @Override public void onResponse(SearchResponse searchResponse) { SearchHit[] hits = searchResponse.getHits().getHits(); for (SearchHit hit : hits) { // 处理查询结果 } } @Override public void onFailure(Exception e) { // 处理异常 } }); client.close(); } } ``` 上述代码,我们通过 ElasticsearchJava 客户端 RestHighLevelClient 发起查询请求,设置查询件为 `matchAllQuery()`,并设置查询结果的起始位置 `from` 和查询结果的数量 `size`,最后设置查询超时时间为 60 秒。 由于查询结果可能包含大量数据,我们使用异步方式 `client.searchAsync()` 处理查询结果,并在回调函数处理查询结果。 注意:在实际使用,需要根据数据量和查询件进行调整,以保证查询效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值