我有以下型号,
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
和网址配置,
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_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)