OpenGrok添加根据文件名后缀进行查询过滤的功能
2015-01-21 12:52
417 查看
<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语义,所以可能还需要提供自己的定制实现。
相关文章推荐
- 百度地图:普通覆盖物,以及多边形覆盖物,及他们的描述信息的添加,修改,删除,查看功能,还有多边形根据名称查询功能;
- AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
- ShopEx customSchema 定制可以根据客户的需求对网站进行相应功能的添加修改或者删除
- JPA(hibernate)一对多根据多的一方某属性进行过滤查询
- mongodb中简单的根据时间过滤进行查询
- hbase中根据Rowkey后缀进行查询
- 如何用js实现,在一个页面有个输入文档框,然后点击查询按扭后,调用IE的查询功能在当前页面进行查询
- c#根据绝对路径获取 带后缀文件名、后缀名、文件名
- .NET中为组合框添加自动查询功能
- Vs2005之简单日志工具的制作--2.根据功能分析进行系统设计
- 根据拼音首字母进行过滤的combobox
- asp.net vb中为组合框添加自动查询功能
- 给ListUI中的查询界面中的(默认)F7字段进行设置过滤
- 进行添加评论操作,添加时,先查询用户是否登录
- 对DataTable数据进行查询过滤
- Excel根据不同列进行OR条件过滤
- Linq to Sql:N层应用中的查询(下) : 根据条件进行动态查询
- 如何结合hibernate进行复杂的查询功能设计
- .NET中为组合框添加自动查询功能
- 利用 IIdentifyDialog 模拟ArcMap工具里面 Identify功能进行要素查询