我无法让index.remove_object真正完成删除对象的操作。即使删除后,它们仍会继续出现在索引中。
我已经通过信号处理器以及在外壳中手动尝试过。我没有收到错误消息,但该对象仍然通过 SearchQuerySet 显示。
相关代码如下:
### search_index.py ###
class BookIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.EdgeNgramField(document=True, use_template=True)
id = indexes.IntegerField(indexed=False, stored=True, model_attr='id')
### shell ###
from haystack import connections
from haystack.query import SearchQuerySet
from .models import Book
book_object = Book.objects.first()
SearchQuerySet().filter(id=book_object.id).count()
--> 1
index = connections['default'].get_unified_index().get_index(Book)
index.remove_object(book_object, using='default')
SearchQuerySet().filter(id=book_object.id).count()
--> 1
book_object.delete() # RealTimeSignalProcessor fires here, confirmed via print statement, no errors
SearchQuerySet().filter(id=book_object.id).count()
--> 1
# Update does work, though, as seen below:
another_book_object = Book.objects.last()
another_book_object.name
--> 'The Shining'
SearchQuerySet().filter(name='The Shining').count()
--> 1
another_book_object.name = 'Lord of the Rings'
another_book_object.save() # RealTimeSignalProcessor fires here
SearchQuerySet().filter(name='The Shining').count() # No longer finds 'The Shining' in index because it has been updated
--> 0
我什至可以向信号处理器添加一条打印语句,显示代码正在触发,但由于某种原因索引本身没有更新。 如果我运行rebuild_index,该对象确实会消失,但我不想每次删除某些内容时都必须这样做。
index.update_object 工作正常,新值反映在索引中。但remove_object不会。
有什么想法吗?
您找到解决这个问题的方法了吗?
抱歉使用答案选项,我没有足够的声誉来评论哈哈