ETJava Beta | Java    注册   登录
  • Lucene 文档域加权

    发表于 2024-04-06 22:25:59     阅读(179)     博客类别:Lucene

    Lucene 文档域加权

    文档域加权 
    文档域加权是为了提高某个关键词的搜索排名,例如 为设置加权时查询到的是 Marry、John、Andy ,如果我们想让Andy在查询时排名靠前
    此时就需要对其单独设置权重,这个权重的设置在文档域中进行设置的
    
    从7.0开始已经去除在创建索引时对指定字段进行权重配置,替代的方式改为查询时使用BoostQuery对要查询的某个字段配置权重
    以下案例以6.x版本演示 在创建文档域时对指定字段加权

    创建索引

    // 封装数据
        private static String ids[]={"1","2","3","4"};
        private static String authors[]={"Jack","Marry","John","Json"};
        private static String titles[]={"Java is a good language.","Java is a cross platform language","Java powerful","You should learn Java"};
    
        // 生成索引库
        private static void createIndex()throws Exception{
            // 1. 获取索引需要保存的路径
            Directory dir = FSDirectory.open(Paths.get("D://lucene03"));
            // 2. 创建IndexWriter 用来创建索引  使用默认分析器
            IndexWriter writer = new IndexWriter(dir,new IndexWriterConfig(new StandardAnalyzer()));
            // 3. 遍历数据 将数据添加到索引
            for (int i = 0; i < ids.length; i++) {
                // 4. 创建Document对象
                Document document = new Document();
                document.add(new TextField("id",ids[i], Field.Store.YES));
                document.add(new TextField("author",authors[i], Field.Store.YES));
                TextField titleField = new TextField("title", titles[i], Field.Store.YES);
                // 对文档域中指定的内容加权
                if("Marry".equals(authors[i])){
                    titleField.setBoost(1.5f);
                }
                document.add(titleField);
                // 5. 添加到索引
                writer.addDocument(document);
            }
            writer.close();
        }

    查询索引

    private static void searchIndex() throws Exception{
            // 1. 获取索引需要保存的路径
            Directory dir = FSDirectory.open(Paths.get("D://lucene03"));
            // 2. 创建IndexReader对象 用来读取索引文件
            IndexReader reader= DirectoryReader.open(dir);
            // 3. 创建IndexSearcher对象 用来读取索引
            IndexSearcher indexSearcher = new IndexSearcher(reader);
            // 4. 创建查询器 TermQuery
            Query query = new TermQuery(new Term("title","java"));
            //BoostQuery query1 = new BoostQuery(query,1.5f);
            // 5. 执行查询 最多返回10条记录
            TopDocs topDocs = indexSearcher.search(query, 10);
            System.out.println("查询 java 共查询到 "+topDocs.totalHits+" 条记录");
            for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
                // 6. 根据docId获取每条数据
                Document document = indexSearcher.doc(scoreDoc.doc);
                System.out.println("title:"+document.get("title")+" - 作者:"+document.get("author"));
            }
            reader.close();
        }

     

上一篇: Lucene 文档维护


下一篇:Lucene 查询索引