root/galaxy-central/lib/galaxy/tools/search/__init__.py

リビジョン 2, 2.1 KB (コミッタ: hatakeyama, 14 年 前)

import galaxy-central

行番号 
1from galaxy.eggs import require
2# Whoosh is compatible with Python 2.5+ Try to import Whoosh and set flag to indicate whether tool search is enabled.
3try:
4    require( "Whoosh" )
5
6    from whoosh.filedb.filestore import RamStorage
7    from whoosh.fields import Schema, STORED, ID, KEYWORD, TEXT
8    from whoosh.index import Index
9    from whoosh.qparser import QueryParser
10    tool_search_enabled = True
11    schema = Schema( id = STORED, title = TEXT, description = TEXT, help = TEXT )
12except ImportError, e:
13    tool_search_enabled = False
14    schema = None
15
16class ToolBoxSearch( object ):
17    """
18    Support searching tools in a toolbox. This implementation uses
19    the "whoosh" search library.
20    """
21   
22    def __init__( self, toolbox ):
23        """
24        Create a searcher for `toolbox`.
25        """
26        self.toolbox = toolbox
27        self.enabled = tool_search_enabled
28        if tool_search_enabled:
29            self.build_index()
30       
31    def build_index( self ):
32        self.storage = RamStorage()
33        self.index = self.storage.create_index( schema )
34        writer = self.index.writer()
35        ## TODO: would also be nice to search section headers.
36        for id, tool in self.toolbox.tools_by_id.iteritems():
37            def to_unicode( a_basestr ):
38                if type( a_basestr ) is str:
39                    return unicode( a_basestr, 'utf-8' )
40                else:
41                    return a_basestr
42
43            writer.add_document( id=id, title=to_unicode(tool.name), description=to_unicode(tool.description), help=to_unicode(tool.help) )
44        writer.commit()
45       
46    def search( self, query, return_attribute='id' ):
47        if not tool_search_enabled:
48            return []
49        searcher = self.index.searcher()
50        parser = QueryParser( "help", schema = schema )
51        # Set query to search title, description, and help.
52        query = "title:query OR description:query OR help:query".replace( "query", query )
53        results = searcher.search( parser.parse( query ), minscore=1.5 )
54        print results.scores
55        return [ result[ return_attribute ] for result in results ]
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。