Django Haystack w / Elasticsearch使用MultiValueField

时间:2016-06-13 04:49:31

标签: django elasticsearch django-haystack

我正在尝试索引一个规范化程度很大的政府数据库。我想从搜索中返回的模型不包含我需要索引的字段,因此我尝试使用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索引的内容?是否允许使用干草堆索引,该索引仅包含返回模型以外的模型的搜索字段?

0 个答案:

没有答案