OpenGrok添加根据文件名后缀进行查询过滤的功能

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">OpenGrok默认会将*.o *.so这些二进制文件也加入索引(其实没什么坏处),如果想在查询时过滤这些文件,怎么做?</span>

要点:

https://github.com/OpenGrok/OpenGrok/blob/master/src/org/opensolaris/opengrok/index/IgnoredNames.java

IgnoredNames是默认的索引过滤,对文件路径做字符串匹配。

https://github.com/OpenGrok/OpenGrok/blob/master/src/org/opensolaris/opengrok/search/SearchEngine.java

可对这里的searchSingleDatabase和searchMultiDatabase做修改。

    private void searchSingleDatabase(File root, boolean paging) throws IOException {
        IndexReader ireader = DirectoryReader.open(FSDirectory.open(root));
        searcher = new IndexSearcher(ireader);
        collector = TopScoreDocCollector.create(hitsPerPage * cachePages, docsScoredInOrder);
        searcher.search(query, collector);
        totalHits = collector.getTotalHits();
        if (!paging && totalHits > 0) {
            collector = TopScoreDocCollector.create(totalHits, docsScoredInOrder);
            searcher.search(query, collector);
        }
        hits = collector.topDocs().scoreDocs;
        for (ScoreDoc hit : hits) {
            int docId = hit.doc;
            Document d = searcher.doc(docId);
            docs.add(d);
        }
    }

注意,这里有2个修改点:修改collector的实现,使得如果文件名后缀是*.so *.o时就不collect;或者修改Document add的条件判断。

修改collector不可行,因为TopScoreDocCollector是Lucene的类,而我只想改改OpenGrok。修改Document add的条件判断较为方便,问题是:如何从Document对象获得“文件名的后缀”这一信息?

在org/opensolaris/opengrok/search包中找不到线索,看看index索引模块。

https://github.com/OpenGrok/OpenGrok/blob/master/src/org/opensolaris/opengrok/index/IndexDatabase.java

Document doc = searcher.doc(top.scoreDocs[0].doc);
String foundPath = doc.get(QueryBuilder.PATH); 

可以获得全路径字符串。从中可以提取出filename suffix信息。问题是可不可以直接得到这个信息呢?

查QueryBuilder代码:

 /**
* Fields we use in lucene public ones
*/
public static final String FULL = "full";
public static final String DEFS = "defs";
public static final String REFS = "refs";
public static final String PATH = "path";
public static final String HIST = "hist";
public static final String TYPE = "type";

没有。这里hist字段不知道是什么意思。

上面的修改可以起效,但可能导致页面显示不一致。更完整的修改应该是在search时提供自己的定制filter:

https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/FieldValueFilter.html

https://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/FieldCacheTermsFilter.html

具体怎么做,没时间研究了。内置的filter类似乎是includes语义,不是excludes语义,所以可能还需要提供自己的定制实现。

时间: 2024-08-11 16:06:53

OpenGrok添加根据文件名后缀进行查询过滤的功能的相关文章

MVC4 路由参数带点 文件名后缀导致错误

错误描述 最近在研究office在线预览,用到mvc4  apicontroller 需要传参是文件名,如test.docx导致错误"指定的目录或文件在 Web 服务器上不存在", 请求的路径如:api/wopi/files/test.docx?access_token=access_token.如下截图: 项目中路由配置: public static class WebApiConfig { public static void Register(HttpConfiguration

自定义 Azure Table storage 查询过滤条件

本文是在Azure Table storage 基本用法一文的基础上,介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table storage 的基本用法,请先移步前文. 文章来源:葡萄城产品技术社区 让我们回到前文中提到的一个问题,如何过滤出 MyLogTable 表中某一天产生的所有日志?在进入细节之前,我们先来回顾一下 MyLogTable 类的设计: internalclassMyLogEntity : TableEntity {

2.23——2.25find命令(上中下);2.26 文件名后缀

2.23 find命令(上) 快捷键: Ctrl + l  :清屏 Ctrl + d :退出终端(相当于执行了:exit 或logout) Ctrl + c : 强制中断 Ctrl + u : 在命令输入行,删除光标前的字符串 Ctrl + e :  光标移到末尾 Ctrl + a :  光标移到开始 which :搜索命令文件(从echo $PATH环境变量下的目录查找) find :搜索文件 1. find 精准搜索:find 搜索路径 -name "精准关键词" [[email 

Vue实现添加、删除、关键字查询

从今天开始,将不定期更新关于 Vue 的学习以及各种方法的使用,好了,下面就开始吧 Vue的实例创建首先需要我们引入一个vue.js(也可以在本地npm安装vue,我为了省事就...),然后在HTML中定义一个 id 为 app 的 div ,这里定义的 id 是看你的个人喜好了,只要和后面我们在 script 标签内一直即可 下面是一个简单的小例子,实现 列表的添加.删除.关键字查询 <!DOCTYPE html> <html lang="en"> <h

Python批量修改文件名-后缀

LyncLynn用途: 批量修改文件格式,文件名后缀. #Version: V1.0 #Author:lynclynn #Description:Change the filename #CreateDate:20151130 #UpdateDate: # -*- coding: UTF-8 -*- import os #列出当前目录(E:\Python\Code)下所有的文件 files =os.listdir("E:\Python\Code") #分离文件名字和后缀 for fil

JavaScript根据文件名后缀判断是否图片文件

//JavaScript根据文件名后缀判断是否图片文件 //图片文件的后缀名 var imgExt = new Array(".png",".jpg",".jpeg",".bmp",".gif"); //获取文件名后缀名 String.prototype.extension = function(){ var ext = null; var name = this.toLowerCase(); var i

2.23/2.24/2.25 find命令 2.26 文件名后缀

2.23/2.24/2.25 find命令 2.26 文件名后缀 2.23/2.24/2.25 find命令 2.23 find命令   上 常用的几个 搜索文件which  whereis 安装 locate 模糊的搜索 不精准的搜索 ctrl a 光标移到命令最前面 ctrl e 光标移到命令最后面 ctrl u 删除光标前面的字符 find 搜索 find 路径  具体的条件 find 搜索文件类型  -type -d目录.-f文件.(-).-l链接 .-s socket文件.-c字符串

django查询过滤

查询过滤: models.UserProfile.objects.filter(name__contains='liu') 忽略大小写在contains前面加个i models.UserProfile.objects.filter(id__range=[1:3]) 根据id查找想要的数据 models.UserProfile.objects.all()[:5] 查询前5条 models.UserProfile..objects.order_by('name')[0]排序取第一条 models.U

获取文件名后缀

//获取文件名后缀 char* fileName = "pwave.sgy"; std::string file_str = fileName; int pos = file_str.rfind('.') + 1; std::string temp = file_str.substr( pos );