예제 #1
0
class FieldRegistry(object):
    def __init__(self, drilldownFields=None):
        self._fieldDefinitions = {
            IDFIELD: _FieldDefinition.define(type=StringField.TYPE_STORED, name=IDFIELD),
        }
        self._drilldownFieldNames = set()
        self._hierarchicalDrilldownFieldNames = set()
        self.facetsConfig = FacetsConfig()
        for field in (drilldownFields or []):
            self.registerDrilldownField(field.name, hierarchical=field.hierarchical, multiValued=field.multiValued)

    def createField(self, fieldname, value, mayReUse=False):
        return self._getFieldDefinition(fieldname).createField(value, mayReUse=mayReUse)

    def createIdField(self, value):
        return self.createField(IDFIELD, value)

    def register(self, fieldname, fieldType):
        self._fieldDefinitions[fieldname] = _FieldDefinition.define(type=fieldType, name=fieldname)

    def phraseQueryPossible(self, fieldname):
        return self._getFieldDefinition(fieldname).phraseQueryPossible

    def isUntokenized(self, fieldname):
        return self._getFieldDefinition(fieldname).isUntokenized

    def registerDrilldownField(self, fieldname, hierarchical=False, multiValued=True):
        self._drilldownFieldNames.add(fieldname)
        if hierarchical:
            self._hierarchicalDrilldownFieldNames.add(fieldname)
        self.facetsConfig.setMultiValued(fieldname, multiValued)
        self.facetsConfig.setHierarchical(fieldname, hierarchical)

    def isDrilldownField(self, fieldname):
        return fieldname in self._drilldownFieldNames

    def isHierarchicalDrilldown(self, fieldname):
        return fieldname in self._hierarchicalDrilldownFieldNames

    def makeDrilldownTerm(self, fieldname, path):
        indexFieldName = self.facetsConfig.getDimConfig(fieldname).indexFieldName;
        return DrillDownQuery.term(indexFieldName, fieldname, path)

    def _getFieldDefinition(self, fieldname):
        fieldDefinition = self._fieldDefinitions.get(fieldname)
        if fieldDefinition is not None:
            return fieldDefinition
        fieldDefinitionCreator = TEXTFIELD
        if fieldname.startswith(SORTED_PREFIX) or fieldname.startswith(UNTOKENIZED_PREFIX):
            fieldDefinitionCreator = STRINGFIELD
        if fieldname.startswith(KEY_PREFIX) or fieldname.startswith(NUMERIC_PREFIX):
            fieldDefinitionCreator = NUMERICFIELD
        fieldDefinition = fieldDefinitionCreator(name=fieldname)
        self._fieldDefinitions[fieldname] = fieldDefinition
        return fieldDefinition
예제 #2
0
 def __init__(self, drilldownFields=None):
     self._fieldDefinitions = {
         IDFIELD:
         _FieldDefinition.define(type=StringField.TYPE_STORED,
                                 name=IDFIELD),
     }
     self._drilldownFieldNames = set()
     self._hierarchicalDrilldownFieldNames = set()
     self.facetsConfig = FacetsConfig()
     for field in (drilldownFields or []):
         self.registerDrilldownField(field.name,
                                     hierarchical=field.hierarchical,
                                     multiValued=field.multiValued)
예제 #3
0
 def __init__(self, directory):
     self.directory = directory
     # create Directories for the search index and for the taxonomy index
     # in RAM or on Disc
     #indexDir = RAMDirectory()
     #taxoDir = RAMDirectory()
     self.indexDir = FSDirectory.open(Paths.get(os.path.join(self.directory,
                                                             INDEX_DIR)))
     self.taxoDir = FSDirectory.open(Paths.get(os.path.join(self.directory,
                                                            TAXONOMY_DIR)))
     # FacetConfig
     self.facets_config = FacetsConfig()
     self.facets_config.setHierarchical("Categories", True)
     self.facets_config.setMultiValued("Categories", True)
예제 #4
0
 def __init__(self, drilldownFields=None):
     self._fieldDefinitions = {
         IDFIELD: _FieldDefinition.define(type=StringField.TYPE_STORED, name=IDFIELD),
     }
     self._drilldownFieldNames = set()
     self._hierarchicalDrilldownFieldNames = set()
     self.facetsConfig = FacetsConfig()
     for field in (drilldownFields or []):
         self.registerDrilldownField(field.name, hierarchical=field.hierarchical, multiValued=field.multiValued)
 def testMergeTwoArray(self):
     f = FacetSuperCollector(None, FacetsConfig(), CachedOrdinalsReader(DocValuesOrdinalsReader()))
     f.mergePool([0, 1, 2, 3, 4])
     f.mergePool([0, 0, 1, 1, 1])
     self.assertEquals([0, 1, 3, 4, 5], f.getFirstArray())
 def testEmpty(self):
     f = FacetSuperCollector(None, FacetsConfig(), CachedOrdinalsReader(DocValuesOrdinalsReader()))
     self.assertEquals(None, f.getFirstArray())
예제 #7
0
class FacetExample(object):

    def __init__(self, directory):
        self.directory = directory
        # create Directories for the search index and for the taxonomy index
        # in RAM or on Disc
        #indexDir = RAMDirectory()
        #taxoDir = RAMDirectory()
        self.indexDir = FSDirectory.open(Paths.get(os.path.join(self.directory,
                                                                INDEX_DIR)))
        self.taxoDir = FSDirectory.open(Paths.get(os.path.join(self.directory,
                                                               TAXONOMY_DIR)))
        # FacetConfig
        self.facets_config = FacetsConfig()
        self.facets_config.setHierarchical("Categories", True)
        self.facets_config.setMultiValued("Categories", True)


    def createIndex(self):
        # index the sample documents
        SimpleIndexer.index(self.indexDir, self.taxoDir, self.facets_config)

    def runSimple(self):
        # open readers
        taxo = DirectoryTaxonomyReader(self.taxoDir)
        indexReader = DirectoryReader.open(self.indexDir)

        for term in searchValues:
            print  "\nsearch by term '%s' ..." % term
            facetRes = SimpleSearcher.searchWithTerm(term, indexReader, taxo,
                                                       self.facets_config)
        print  "\nsearch all documents  ..."
        facetRes = SimpleSearcher.searchWithFacets(indexReader, taxo,
                                                   self.facets_config)
        # close readers
        taxo.close()
        indexReader.close()
        # return result
        return facetRes

    def runDrillDown(self):
        # open readers
        taxo = DirectoryTaxonomyReader(self.taxoDir)
        indexReader = DirectoryReader.open(self.indexDir)

        for drilldown in drilldownCategories:
            print "search with drilldown: %s" %  '/'.join(drilldown)
            facetRes = SimpleSearcher.searchWithDrillDown(drilldown, indexReader,
                                                          taxo, self.facets_config)
        # close readers
        taxo.close()
        indexReader.close()
        # return result
        return facetRes

    def main(cls, argv):
        baseDir = os.path.dirname(os.path.abspath(argv[0]))
        if len(argv) > 1:
            index = simple = drilldown = False
            for arg in argv[1:]:
                if arg == "index":
                    index = True
                elif arg == "simple":
                    simple = True
                elif arg == "drilldown":
                    drilldown = True
                else:
                    sys.exit(usage+"\nunknown argument: %s" % arg)
        else:
            index = simple = True
            drilldown = False

        example = FacetExample(baseDir)
        if index:
            example.createIndex()
        if simple:
            example.runSimple()
        if drilldown:
            example.runDrillDown()

    main = classmethod(main)
예제 #8
0
class FieldRegistry(object):
    def __init__(self, drilldownFields=None):
        self._fieldDefinitions = {
            IDFIELD:
            _FieldDefinition.define(type=StringField.TYPE_STORED,
                                    name=IDFIELD),
        }
        self._drilldownFieldNames = set()
        self._hierarchicalDrilldownFieldNames = set()
        self.facetsConfig = FacetsConfig()
        for field in (drilldownFields or []):
            self.registerDrilldownField(field.name,
                                        hierarchical=field.hierarchical,
                                        multiValued=field.multiValued)

    def createField(self, fieldname, value, mayReUse=False):
        return self._getFieldDefinition(fieldname).createField(
            value, mayReUse=mayReUse)

    def createIdField(self, value):
        return self.createField(IDFIELD, value)

    def register(self, fieldname, fieldType):
        self._fieldDefinitions[fieldname] = _FieldDefinition.define(
            type=fieldType, name=fieldname)

    def phraseQueryPossible(self, fieldname):
        return self._getFieldDefinition(fieldname).phraseQueryPossible

    def isUntokenized(self, fieldname):
        return self._getFieldDefinition(fieldname).isUntokenized

    def registerDrilldownField(self,
                               fieldname,
                               hierarchical=False,
                               multiValued=True):
        self._drilldownFieldNames.add(fieldname)
        if hierarchical:
            self._hierarchicalDrilldownFieldNames.add(fieldname)
        self.facetsConfig.setMultiValued(fieldname, multiValued)
        self.facetsConfig.setHierarchical(fieldname, hierarchical)

    def isDrilldownField(self, fieldname):
        return fieldname in self._drilldownFieldNames

    def isHierarchicalDrilldown(self, fieldname):
        return fieldname in self._hierarchicalDrilldownFieldNames

    def makeDrilldownTerm(self, fieldname, path):
        indexFieldName = self.facetsConfig.getDimConfig(
            fieldname).indexFieldName
        return DrillDownQuery.term(indexFieldName, fieldname, path)

    def _getFieldDefinition(self, fieldname):
        fieldDefinition = self._fieldDefinitions.get(fieldname)
        if fieldDefinition is not None:
            return fieldDefinition
        fieldDefinitionCreator = TEXTFIELD
        if fieldname.startswith(SORTED_PREFIX) or fieldname.startswith(
                UNTOKENIZED_PREFIX):
            fieldDefinitionCreator = STRINGFIELD
        if fieldname.startswith(KEY_PREFIX) or fieldname.startswith(
                NUMERIC_PREFIX):
            fieldDefinitionCreator = NUMERICFIELD
        fieldDefinition = fieldDefinitionCreator(name=fieldname)
        self._fieldDefinitions[fieldname] = fieldDefinition
        return fieldDefinition