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); } }

6、统计solr目录索引信息的更多相关文章

  1. macOS安装Solr并索引MySQL

    安装 Java 语言的软件开发工具包 brew cask install java 或者在 Oracle官网 中选择 Mac 版本 jdk-8u111-macosx-x64.dmg 下载并安装. 安装 ...

  2. solr安装部署、solr测试创建core、用solrj 访问solr(索引和搜索)

    一.安装solr4.8: 1.把apache-solr-4.8.1\example\webapps下的solr.war文件拷贝到Tomcat下的Tomcat7.0\webapps目录下,tomcat启 ...

  3. 2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

     1  Lucen目录介绍 2  lucene-core-3.6.2.jar是lucene开发核心jar包 contrib  目录存放,包含一些扩展jar包 3  案例 建立第一个Lucene项目 ...

  4. Django 博客开发教程目录索引

    Django 博客开发教程目录索引 本项目适合 0 基础的 Django 开发新人. 项目演示地址:Black & White,代码 GitHub 仓库地址:zmrenwu/django-bl ...

  5. Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程

    2.Lucene3.6.2包介绍,第一个Lucene案例介绍,查看索引信息的工具lukeall介绍,Luke查看的索引库内容,索引查找过程 2014-12-07 23:39 2623人阅读 评论(0) ...

  6. java~springboot(2022之后)~目录索引

    回到占占推荐博客索引 最近写了不过关于java,spring,微服务的相关文章,今天把它整理一下,方便大家学习与参考. java~springboot(2022之前)~目录索引 java~spring ...

  7. 【无私分享:ASP.NET CORE 项目实战】目录索引

    简介 首先,我们的  [无私分享:从入门到精通ASP.NET MVC]   系列已经接近尾声,希望大家在这个过程中学到了一些思路和方法,而不仅仅是源码. 因为是第一次写博客,我感觉还是比较混乱的,其中 ...

  8. 《BI那点儿事—数据的艺术》目录索引

    原创·<BI那点儿事—数据的艺术>教程免费发布 各位园友,大家好,我是Bobby,在学习BI和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料,本来只是内部学习使用,但为了方便 ...

  9. 人人都是 DBA(XIII)索引信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...

随机推荐

  1. debian系(Ubuntu)安装jenkins(持续集成)

    wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'ec ...

  2. 字符串编码---hash函数的应用

    之前就听说过有个叫做hash表的东西,这段时间在上信息论与编码,也接触了一些关于编码的概念,直到今天做百度之星的初赛的d题时,才第一次开始学并用hash 一开始我用的是mutimap和mutiset, ...

  3. Mysql创建函数出错

    目前在项目中,执行创建mysql的函数出错, mysql 创建函数出错信息如下: Error Code: 1227. Access denied; you need (at least one of) ...

  4. 面试题,自己写写dome总是好的

    1.完成如下图所示的布局 <html> <head> <meta http-equiv="Content-Type" content="te ...

  5. input 不支持HTML5的placeholder属性

    解决方法如下: <input type="text" value="搜索乐高资讯" onfocus="if(this.value=='搜索乐高资 ...

  6. PYTHON-进阶-ITERTOOLS模块

    PYTHON-进阶-ITERTOOLS模块小结 这货很强大, 必须掌握 文档 链接 pymotw 链接 基本是基于文档的翻译和补充,相当于翻译了 itertools用于高效循环的迭代函数集合 组成 总 ...

  7. ARM的两种启动方式 (NAND FLASH. NOR FLASH)

    为什么会有两种启动方式? 这就是有两种FLASH 的不同特点决定的. NAND FLASH 容量大,存储的单位比特数据的成本要低很多,但是要按照特定的时序对NAND  FLASH  进行读写,因此CP ...

  8. ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()

    ROW_NUMBER()/RANK()/DENSE_RANK()/ntile() over()   今天女票问我SqlServer的四种排序,当场写了几句Sql让她了解,现把相关Sql放上来. 首先, ...

  9. Android4.0强制横屏竖屏

    Android的启动默认是横屏或者竖屏我们的TV本来是横屏显示,但是有客户竟然要竖屏显示,昨天快下班收到的需求,竟然说7.19就要搞定.思路有2个,一个就是修改LCD的默认输出,但是这个不是我这个水平 ...

  10. dom4j解析xml字符串

    import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.Docume ...