我正在尝试索引一个规范化程度很大的政府数据库。我想从搜索中返回的模型不包含我需要索引的字段,因此我尝试使用MultiValueFields。我的搜索结果为0。
如何看到elasticsearch索引的内容?是否允许使用干草堆索引,该索引仅包含返回模型以外的模型的搜索字段?
来自models.py
class Person(models.Model):
per_idn = models.IntegerField(primary_key=True)
sex_cod = models.ForeignKey(Sex, to_field='sex_cod_val_cod')
...
class Name(models.Model):
name_idn = models.IntegerField(primary_key=True)
per_idn = models.ForeignKey(Person, to_field='per_idn')
name_txt = models.CharField()
...
class Birthdate(models.Model):
bd_idn = models.IntegerField(primary_key=True)
per_idn = models.ForeignKey(Person, to_field='per_idn')
bd_txt = models.CharField()
...
来自search_indexes.py
class PersonIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
names = indexes.MultiValueField()
dobs = indexes.MultiValueField()
def prepare_names(self,obj):
return [Name.name_txt for Name in Name.objects.filter(per_idn=obj.per_idn)]
def prepare_dobs(self,obj):
return [Birthdate.bd_txt for Birthdate in Birthdate.objects.filter(per_idn=obj.per_idn)]
def get_model(self):
return Person
def index_queryset(self, using=None):
return self.get_model().objects.filter()
我之前创建了一个NameIndex并且它工作正常,但是有超过14,000,000个名字用于4.8百万人,我还需要能够过滤掉DOB。它还可以使生命更容易返回人物对象而不是名称对象。我知道有多个名字与一个人相关似乎很奇怪,但这是一个政府数据库,人们经常有许多人。
./ manage.py rebuild_index执行正常。我做了一些调试并将name和dob的值打印到控制台,因为它正在编制索引,并且准备函数中返回了正确的值。当我使用search.html模板时,无论查询是什么,我都得到0结果。
>来自./manage.py shell>>> from haystack.query import SearchQuerySet
>>> sqs = SearchQuerySet().all()
>>> len(sqs)
4799561
>>> sqs = SearchQuerySet().auto_query('jones')
>>> len(sqs)
0
>>>
来自curl -XGET' http://127.0.0.1:9200/my_index_name/_mapping?pretty=1'
{
"my_index_name" : {
"mappings" : {
"modelresult" : {
"properties" : {
"django_ct" : {
"type" : "string",
"index" : "not_analyzed",
"include_in_all" : false
},
"django_id" : {
"type" : "string",
"index" : "not_analyzed",
"include_in_all" : false
},
"dobs" : {
"type" : "string",
"analyzer" : "snowball"
},
"id" : {
"type" : "string"
},
"names" : {
"type" : "string",
"analyzer" : "snowball"
},
"text" : {
"type" : "string",
"analyzer" : "snowball"
}
}
}
}
如何看到elasticsearch索引的内容?是否允许使用干草堆索引,该索引仅包含返回模型以外的模型的搜索字段?