簡體   English   中英

Haystack + Xapian:無法使用自動完成功能

[英]Haystack + Xapian: Can't get autocomplete functionality working

我正在嘗試在服務器上進行自動完成搜索。 這是我的一個索引器類的示例:

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    artist_name = indexes.CharField(model_attr='clean_artist_name', null=True)
    submitted_date = indexes.DateTimeField(model_attr='submitted_date')
    total_count = indexes.IntegerField(model_attr='total_count')

    # This is used for autocomplete
    content_auto = indexes.NgramField(use_template=True)

    def get_model(self):
        return Artist

    def index_queryset(self, using=None):
        """ Used when the entire index of a model is updated. """
        return self.get_model().objects.filter(date_submitted__lte=datetime.now())

    def get_updated_field(self):
        return "last_data_change"

使用模板填充textcontent_auto字段,對於Artts而言,它們只是藝術家的名字。 根據文檔,類似這樣的東西應該可以自動完成:

objResultSet = SearchQuerySet().models(Artist).autocomplete(content_auto=search_term)

但是,使用字符串“ bill w”嘗試此操作將返回Bill Stephney作為最高結果,然后返回Bill Withers作為第二結果。 這是因為Bill Stephney在數據庫中有更多的記錄,但是Stephney不應與該查詢匹配:一旦檢測到“ w”,它就只能與Bill Withers(和其他Bill Ws)匹配。 我也嘗試過通配符:

objResultSet = SearchQuerySet().models(Artist).filter(content_auto=search_term + '*')

objResultSet = SearchQuerySet().models(Artist).filter(text=AutoQuery(search_term + '*'))

但是通配符似乎會引起很多問題,開發服務器會掛起,並最終由於“ Write Failed: Broken Pipe錯誤而帶有隱秘的堆棧跟蹤而最終停止,所有這些都在Python框架內。 有沒有人設法使它正常工作? NgramField是正確使用的類型嗎? 我嘗試使用EdgeNgramField,但這給了我類似的結果。

我相信Haystack文檔建議EdgeNgramField用於“標准文本”,我認為它是英文。 他們建議將NgramField用於亞洲語言,或者如果您想跨單詞邊界進行匹配。 即,我認為您希望content_auto使用EdgeNgramField

 content_auto = indexes.EdgeNgramField(use_template=True)

另外,由於n-gram並非完全是通配符搜索(例如,以我們在shell腳本全局匹配中使用* [星號]的方式),因此不應在過濾器中使用*。

我發現使搜索結果有所不同的一件事是您可以在后端引擎中調整的參數-n-gram標記器和n-gram過濾器都有設置。 根據您使用的搜索引擎后端,更改min_gram值將影響您在匹配項中獲得的結果。

我只使用了elasticsearch后端,所以我不知道其他后端是否對這些n-gram設置像solr / elasticsearch一樣敏感。 基本上,我根據干草堆附帶的默認后端創建了一個自定義后端,並調整了min_gram值以測試匹配項。 您設置的值越高,匹配就越“准確”,因為它必須匹配更長的令牌。

有關在彈性搜索中使用具有自定義n-gram設置的后端的信息,請參見以下問題:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM