5 统计solr目录索引信息
Posted life_start
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5 统计solr目录索引信息相关的知识,希望对你有一定的参考价值。
package com.main.java.solr.statistics; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexableField; import org.apache.lucene.search.ScoreDoc; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 统计目录下索引信息 */ public class SolrIndexInfoStatistics { public static final Logger LOG= LoggerFactory.getLogger(SolrIndexInfoStatistics.class); private static final String DEFAULT_PATH="/data/index"; private static String upperDir; private static List<SolrIndexInfo> result; /** * 给出一个上层目录,统计所有子目录的索引信息 (目录名称,索引数目,字段个数,一行字段值和字段名称 * @param args */ public static void main(String[] args) { if(null==args||0==args.length){ args=new String[]{"F:\\indexTest"}; // return; } upperDir=args[0]; statisticsSolrIndexInfo(upperDir); displayIndexInfo(result); } //计目录下索引信息 private static void statisticsSolrIndexInfo(String upperDir){ List<String> list=fetchSubDirs(upperDir); result=new ArrayList<>(); for (String path : list) { IndexReader reader=SolrUtil.getReader(path); if(null==reader){ continue; } ScoreDoc [] scoreDoc=SolrUtil.queryDocs(reader,path); if(null ==scoreDoc){ continue; } SolrIndexInfo info=new SolrIndexInfo(); info.setFilePath(path); info.setIndexNum(scoreDoc.length); Document doc=null; try { doc=reader.document(scoreDoc[0].doc); } catch (IOException e) { e.printStackTrace(); } List<IndexableField> fieldsList= doc.getFields(); String [] fields=new String[fieldsList.size()]; Object [] values=new Object[fieldsList.size()]; for(int i=0;i<fieldsList.size();i++){ fields[i]=fieldsList.get(i).name(); values[i]=doc.get(fields[i]); } info.setFields(fields); info.setValues(values); info.setFieldNum(fieldsList.size()); result.add(info); } } //展示获取的索引信息 private static void displayIndexInfo(List<SolrIndexInfo> infos){ for (SolrIndexInfo info : infos) { System.out.println(info.toString()); } } //获取子目录 private static List<String> fetchSubDirs(String upperDir){ List<String> list=new ArrayList<>(); //判断目录是否存在 if(!new File(upperDir).exists()){ LOG.error("目录不存在:{}",upperDir); return list; } File [] files=new File(upperDir).listFiles(); for (File file : files) { String fileName=file.getName(); String filePath=upperDir+File.separator+fileName+DEFAULT_PATH; if(new File(filePath).exists()){ list.add(filePath); }else{ LOG.error("目录不存在:{}",filePath); } } return list; } }
package com.main.java.solr.statistics; /** * 索引信息 (目录名称,索引数目,字段个数,三行字段值和字段名称 字段名称s ,一行字段值 */ public class SolrIndexInfo { private String filePath; private int indexNum; private int fieldNum; private String [] fields; private Object [] values; public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public int getIndexNum() { return indexNum; } public void setIndexNum(int indexNum) { this.indexNum = indexNum; } public int getFieldNum() { return fieldNum; } public void setFieldNum(int fieldNum) { this.fieldNum = fieldNum; } public String[] getFields() { return fields; } public void setFields(String[] fields) { this.fields = fields; } public Object[] getValues() { return values; } public void setValues(Object[] values) { this.values = values; } public String toString(){ StringBuffer sb=new StringBuffer(); sb.append("索引目录:").append(filePath).append(",") .append("索引数目:").append(indexNum).append(",") .append("索引字段个数:").append(fieldNum).append(",") .append("字段名称和值:"); for(int i=0;i<fields.length;i++){ StringBuilder builder=new StringBuilder(); String fieldInfo=builder.append(fields[i]).append(":").append(values[i]).append(",").toString(); sb.append(fieldInfo); } return sb.toString(); } }
package com.main.java.solr.statistics; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.DirectoryReader; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryparser.classic.ParseException; 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.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.NIOFSDirectory; import org.apache.solr.store.hdfs.HdfsDirectory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Paths; /** * Solr常用方法 */ public class SolrUtil { public static final Logger LOGGER= LoggerFactory.getLogger(SolrUtil.class); /** * 设置查询条件 * @param queryDefaultFieldName 查询的字段信息 *:* 表示查询所有字段 * @return query * @throws org.apache.lucene.queryparser.classic.ParseException */ public static Query getQuery(String queryDefaultFieldName) throws ParseException { //实例化分析器 Analyzer analyzer=new StandardAnalyzer(); //建立查询解析器 /** * 第一个参数是要查询的字段; * 第二个参数是分析器Analyzer * */ QueryParser parser=new QueryParser(queryDefaultFieldName, analyzer); //根据传进来的queryStr查找 Query query = parser.parse("*:*"); return query; } /** * 通过directory得到的路径下的所有的文件 * @param luceneFileDir lucene文件路径,linux 本地路径"/usr/temp/lucene/index"和hdfs路径 "hdfs://SERVICE-HADOOP-001,hdh184:8020,hdh185:8020/tmp/lucene/index" * @return indexReader */ public static IndexReader getReader(String luceneFileDir){ IndexReader reader=null; if(luceneFileDir.contains("hdfs")){ Configuration conf =new Configuration(); try { HdfsDirectory directory=new HdfsDirectory(new Path(luceneFileDir),conf); reader= DirectoryReader.open(directory); } catch (IOException e) { LOGGER.error(("读取索引目录异常,索引目录:" + luceneFileDir + " 异常信息:" + e.getMessage())); } return reader; }else{ try { //得到读取索引文件的路径 Directory dir = NIOFSDirectory.open(Paths.get(luceneFileDir)); //通过dir得到的路径下的所有的文件 reader= DirectoryReader.open(dir); }catch (IOException e){ LOGGER.error(("读取索引目录异常,索引目录:"+luceneFileDir+" 异常信息:"+e.getMessage())); } if(null==reader){ LOGGER.warn("初始化indexReader失败,reader is null"); } return reader; } } /** * 获取索引信息 * @param reader IndexReader * @return ScoreDoc[] 存储的为所有索引数据的id */ public static ScoreDoc[] queryDocs(IndexReader reader,String luceneFileDir){ ScoreDoc[] docs =null; if(null!=reader){ //索引总条数 int numDocs=reader.numDocs(); if(0==numDocs){ return docs; } //建立索引查询器 IndexSearcher is=new IndexSearcher(reader); //设置查询条件 Query query; try { query = SolrUtil.getQuery("*:*"); if(null!=query){ TopDocs hits; /** * 第一个参数是通过传过来的参数来查找得到的query; * 第二个参数是要出查询的行数 * */ hits = is.search(query, numDocs); if(null!=hits){ //获取所有的索引id集合 docs= hits.scoreDocs; LOGGER.info("查询到目录"+luceneFileDir+"索引总条数为:"+docs.length); } else{ LOGGER.error("查询出错,未查询到满足query条件的索引信息"); } }else{ LOGGER.info("indexSearch和query初始化失败,"+"IndexSearch:"+is+" query:"+query); } } catch (ParseException e) { LOGGER.error("获取查询条件异常,异常信息:{}",e.getMessage()); }catch (IOException e) { LOGGER.error("查询索引信息异常,异常信息:{}",e.getMessage()); } }else{ LOGGER.warn("reader is null 无法获取索引信息"); } return docs; } public static void main(String[] args) { int [] nums=new int[]{5337424, 8354699, 5737071, 6785709, 5169227, 4083041, 4822605, 4235623, 3968948, 3059084, 3460965, 6991442}; int max=0; for (int num : nums) { max=max+num; } System.out.println(max); } }
以上是关于5 统计solr目录索引信息的主要内容,如果未能解决你的问题,请参考以下文章
02 Apache Solr: 概览 Solr在信息系统架构中的位置