您的位置:首页 > 运维架构

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语义,所以可能还需要提供自己的定制实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: