当前位置: 首页 > 知识库问答 >
问题:

Eclipse JDT搜索引擎的替代或改进

钱嘉致
2023-03-14

我正在寻找一种方法来改进Eclipse的搜索引擎类的运行时,或者另一种可以取代它的搜索技术。目前,我正在搜索给定项目的源文件中所有方法的所有引用。此技术适用于较小的项目,但运行时呈指数级增长,并且在超过几个 MB 的项目中变得无用。

我用来查找方法引用的当前代码是:

public void processProject(IJavaProject javaProject) throws JavaModelException{
    initializeEngine(javaProject);
    for(IPackageFragment pkg : javaProject.getPackageFragments()){
        if(pkg.getKind() == IPackageFragmentRoot.K_SOURCE){
            for(ICompilationUnit unit : pkg.getCompilationUnits()){
                System.out.println("Unit: " + unit.getElementName());
                for(IType type : unit.getTypes()){
                    for(IMethod method : type.getMethods()){
                        //getReferenceMatches(method, javaProject);
                        searchFor(method);
                    }
                }
            }
        }
    }
}
public void initializeEngine(IJavaProject searchIn) throws JavaModelException{
    ArrayList<IPackageFragmentRoot> roots = new ArrayList<IPackageFragmentRoot>();
    for(IPackageFragmentRoot root : searchIn.getPackageFragmentRoots()){
        if(root.getKind() == IPackageFragmentRoot.K_SOURCE)
            roots.add(root);
    }
    IJavaElement[] elems = new IJavaElement[roots.size()];
    elems =  roots.toArray(elems);

    scope = SearchEngine.createJavaSearchScope(elems);


    engine = new SearchEngine();
    participants = new SearchParticipant[]{SearchEngine.getDefaultSearchParticipant()};


}
//search for methods, or other element type
public void searchFor(IJavaElement elem){
    requestor = new SimpleRequestor();
    pattern = SearchPattern.createPattern(elem, IJavaSearchConstants.REFERENCES);
    try{
        engine.search(pattern, participants, scope, requestor, null);
    }catch(CoreException e){
        e.printStackTrace();
    }
}
class SimpleRequestor extends SearchRequestor{
private ArrayList<SearchMatch> matches;

public SimpleRequestor(){
    super();
    matches = new ArrayList<SearchMatch>();
}
@Override
public void acceptSearchMatch(SearchMatch match) throws CoreException {
    if(match.getAccuracy() == SearchMatch.A_ACCURATE);
        matches.add(match);
}

public ArrayList<SearchMatch> getMatches(){
    return matches;
}

}

范围、引擎、模式、参与者和请求者都是全局变量。

我目前没有保存结果,因为现在我担心的只是搜索的运行时。直接扫描(遍历每个源文件并保存所有参考实例)会更快吗?有没有办法提升搜索引擎?

似乎如果我使用内置的Eclipse搜索(右键单击方法-

共有1个答案

曾英睿
2023-03-14

不要认为搜索引擎是为了搜索所有方法的所有引用而设计的。我怀疑您的代码实际上会多次检查相同的源文件。

内置搜索工作得更快,可能是因为您只搜索一个方法的引用。

这里有一些关于搜索引擎内部的细节-http://wiki.eclipse.org/JDT_Core_Programmer_Guide#Search_Engine-这可能会让你对正在发生的事情有所了解。

 类似资料:
  • 搜索引擎分为两部分: 时间筛选 和 搜索引擎 (详情) 1.时间筛选 便捷按钮有今日、昨日、前日、上周 X、近七天,并且能自定义选择时间段来得出想要的结果报表 2.搜索引擎 (时间段详情) 选择日期,查看来自对应时间段内,各个搜索引擎的访问量比例

  • lucene 和 es 的前世今生 lucene 是最先进、功能最强大的搜索库。如果直接基于 lucene 开发,非常复杂,即便写一些简单的功能,也要写大量的 Java 代码,需要深入理解原理。 elasticsearch 基于 lucene,隐藏了 lucene 的复杂性,提供了简单易用的 restful api / Java api 接口(另外还有其他语言的 api 接口)。 分布式的文档存储

  • 搜索引擎 关键参数 报告 method metrics(指标, 数据单位) 其他参数 搜索引擎 source/engine/a pv_count (浏览量(PV)) pv_ratio (浏览量占比,%) visit_count (访问次数) visitor_count (访客数(UV)) new_visitor_count (新访客数) new_visitor_ratio (新访客比率,%) ip

  • 更改历史 * 2018-05-07 胡小根 初始化文档 1 历史、现状和发展 1.1 历史 1.2 现状 1.3 发展 难点:预测发展方向。 2 安装和使用 2.1 安装 2.2 使用 创建index和type 上传单条数据 批量上传数据 查询 2.3 示例 2.4 最佳实践 难点:最佳实践,超出于示例,应该归纳总结出积累的技巧。 3 同类技术对比 难点:归纳比对项 参考资料 El

  • 元搜索引擎 原搜索引擎是通过一个统一的用户界面帮助用户在多个搜索引擎中选择和利用合适的搜索引擎来实现检索操作,是对分布于网络的多种检索工具的全局控制机制。 自己没搜索引擎,又想要大规模的数据源,怎么办?可以对百度搜索和谷歌搜索善加利用,以小搏大,站在巨人的肩膀上。有很多的应用场景可以很巧妙地借助百度搜索和谷歌搜索来实现,比如网站的新闻采集,比如技术、品牌的新闻跟踪,比如知识库的收集,比如人机问答系

  • 问题内容: 我正在为基于php的网站创建一个搜索引擎。我需要搜索一个mysql表。 事实是,搜索引擎必须非常“智能”,以便用户可以轻松找到他们的商品(这是一个分类网站)。 我目前已使用以下代码设置了FULLTEXT搜索: 但这还不够… 例如,假设该字段包含类似的内容。如果我搜索,我将不会得到任何结果。尾数(’ci’)只是汽车型号中许多尾数之一,在搜索表时必须将其考虑在内。 或者,如果该字段是什么?