在xapian后端的django-haystack中,可以通过自定义Field的方式来实现浮点数索引。具体步骤如下:
在搜索
应用
的文件夹下新建一个fields.py文件;
在fields.py中定义一个新的Field,代码如下:
from django.utils import six
from django.core.exceptions import ValidationError
from haystack import fields
class FloatField(fields.FloatField):
A float field that supports indexing and searching as a float in Xapian
def prepare(self, obj):
value = super(FloatField, self).prepare(obj)
if value is None:
return None
value = float(value)
except (TypeError, ValueError):
raise ValidationError("Unable to convert value '%s' to float." % value)
return six.text_type(value)
在搜索应用的search_indexes.py文件中定义索引类,并在其中调用自定义的FloatField,代码如下:
from haystack import indexes
from .models import MyModel
from .fields import FloatField
class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
MyModel索引类
text = indexes.CharField(document=True, use_template=True)
my_float = FloatField(model_attr='float_field')
def get_model(self):
return MyModel
def index_queryset(self, using=None):
return self.get_model().objects.all()
重新生成索引,即可支持浮点数索引。
注意:由于xapian不支持直接存储浮点数,需要在自定义Field的prepare方法中将浮点数转换为字符串形式,以便进行索引。在索引时也需要调用自定义的FloatField。