search api使用drf haystack返回空列表进行弹性搜索

时间:2018-02-01 16:03:15

标签: python django elasticsearch drf-haystack

我有以下模特,

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文档,

drf haystack documentation

提到,我正在使用

elastic search( version 5.4.0)
elastic search-dsl( version 5.3.0)

0 个答案:

没有答案