10. CubicWeb中的全文索引¶
当属性标记为 fulltext-indexable 在数据模型中,CubicWeb将自动触发挂钩以更新内部全文索引(即 appears SQL表)每次修改此属性时。
CubicWeb还提供 db-rebuild-fti 按需重新生成整个全文的命令:
cubicweb@esope~$ cubicweb db-rebuild-fti my_tracker_instance
还可以为给定的一组实体类型重新生成全文索引:
cubicweb@esope~$ cubicweb db-rebuild-fti my_tracker_instance Ticket Version
在上面的示例中,只有实体类型的全文索引 Ticket 和 Version 将被重建。
10.1. 标准FTI工艺¶
考虑实体类型 ET ,默认的 fti 过程是为了:
获取类型的所有实体
ET对于每个实体,使其适应
IFTIndexable(见IFTIndexableAdapter)调用
get_words()在应该返回字典的适配器上 重量 > 单词表 如预期index_object().每个属性值的标记化技术是由tokenize().
见 IFTIndexableAdapter 更多文档。
10.2. 山药和 fulltext_container¶
在数据模型中,可以指示为实体类型定义的全文索引属性将用于索引实体本身,而不是相关实体。这对于复合实体尤其有用。让我们来看一下CubicWeb中定义的基本模式(简化版)(请参见 cubicweb.schemas.base ):
class CWUser(WorkflowableEntityType):
login = String(required=True, unique=True, maxsize=64)
upassword = Password(required=True)
class EmailAddress(EntityType):
address = String(required=True, fulltextindexed=True,
indexed=True, unique=True, maxsize=128)
class use_email_relation(RelationDefinition):
name = 'use_email'
subject = 'CWUser'
object = 'EmailAddress'
cardinality = '*?'
composite = 'subject'
上面的模式说明 CWUser 和 EmailAddress 以及 address 领域 EmailAddress 是全文索引。因此,在应用程序中,如果使用全文搜索查找电子邮件地址,CubicWeb将返回 EmailAddress 本身。但是我们要索引的对象更可能是 CWUser 比 EmailAddress 本身。
实现这一点的最简单方法是标记 use_email 数据模型中的关系:
class use_email(RelationType):
fulltext_container = 'subject'
10.3. 自定义获取实体的方式 db-rebuild-fti¶
db-rebuild-fti 将调用 cw_fti_index_rql_limit() 实体类型的类方法。
10.4. 定制 get_words()¶
您还可以通过提供自己的FTI流程来定制FTI流程。 get_words() 实施:
from cubicweb.entities.adapters import IFTIndexableAdapter
class SearchIndexAdapter(IFTIndexableAdapter):
__regid__ = 'IFTIndexable'
__select__ = is_instance('MyEntityClass')
def fti_containers(self, _done=None):
"""this should yield any entity that must be considered to
fulltext-index self.entity
CubicWeb's default implementation will look for yams'
``fulltex_container`` property.
"""
yield self.entity
yield self.entity.some_related_entity
def get_words(self):
# implement any logic here
# see http://www.postgresql.org/docs/9.1/static/textsearch-controls.html
# for the actual signification of 'C'
return {'C': ['any', 'word', 'I', 'want']}