我有以下模特,
class ProductKeyword(models.Model):
name = models.CharField(max_length=100)
product = models.ManyToManyField(Product, related_name="products")
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.name)
和搜索索引,
class ProductKeyWordIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr="name")
product = indexes.CharField(model_attr="product")
autocomplete = indexes.EdgeNgramField()
@staticmethod
def prepare_autocomplete(obj):
return " ".join((
obj.name, obj.product
))
def get_model(self):
return ProductKeyword
def index_queryset(self, using=None):
return self.get_model().objects.filter(
date_created__lte=timezone.now()
)
和视图集,
class ProductKeywordSearchView(HaystackViewSet):
index_models = [ProductKeyword]
serializer_class = ProductKeywordSerializer
和url配置,
router = routers.DefaultRouter()
router.register(r'prod_key', ProductKeywordSearchView, base_name="prod-key-
search")
# The API URLs are now determined automatically by the router.
urlpatterns = [
url(r'^', include(router.urls))
]
和settings.py(haystack配置)
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE':
'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://localhost:9200/',
'INDEX_NAME': 'bhkhata',
'INCLUDE_SPELLING': True,
'TIMEOUT': 300,
},
}
我通过django shell保存了数据,并检查数据是否已成功保存在ProductKeyword
模型中。
尝试使用以下搜索API来获取结果,
http://localhost:8090/api/hs/prod_key/?name=sayaabintel
但它返回一个200状态的空列表。
我是弹性搜索的新手,所以不确定是什么导致上面的api返回空列表,可能有一种可能性我想要搜索的对象,没有被弹性索引搜索,所以我已经应用了弹性搜索的以下管理命令来构建索引,
python manage.py update_index
但是api仍然返回一个空列表
然后我尝试了以下内容,
python manage.py rebuild_index
仍然返回一个空列表
然后
python manage.py clear_index
还没有工作,返回一个空列表
所以我在这里缺少什么?我遵循了以下drf-haystack文档,
提到,我正在使用
elastic search( version 5.4.0)
elastic search-dsl( version 5.3.0)