Схема whoosh в haystack и django

Я пытаюсь интегрировать поисковик whoosh в проект django. Я видел, что это можно сделать с помощью haystack, но я понял, что не могу (пока не знаю), как добавить мой пользовательский индекс whoosh в поисковик. В моей схеме есть ID, KEYWORD и TEXT, но на самом деле все они являются текстом. Я использовал эти схемы, потому что они соответствуют моим потребностям поиска для каждого из документов. Как мне использовать эту схему в Haystack.

PS: Решение без Haystack тоже подойдет.

Вот моя схема whoosh/писателя/исследователя

import pandas as pd
from whoosh.index import create_in
from whoosh.fields import *
from whoosh.qparser import QueryParser
from whoosh.query import *

def nan2none(x):
    y = None if pd.isna(x) else x
    return(y)

df = pd.read_csv("df.csv", index_col=[0])

schema = Schema(a = ID(stored=True),
                b = KEYWORD(lowercase=True),
                c = TEXT,
                d = KEYWORD(lowercase=True))

ix = create_in("indexdir", schema)
writer = ix.writer()

for index, row in df.iterrows():
    writer.add_document(a = index,
                        b = nan2none(row['b']),
                        c = nan2none(row['c']),
                        d = nan2none(row['d']))
writer.commit()

search_term = "hobbit"
with ix.searcher() as searcher:
    a_query = QueryParser("a", ix.schema).parse(search_term)
    b_query = QueryParser("b", ix.schema).parse(search_term)
    c_query = QueryParser("b", ix.schema).parse(search_term)
    d_var_query = QueryParser("d", ix.schema, termclass=Variations).parse(search_term)
    d_fuzz_query = QueryParser("d", ix.schema, termclass=FuzzyTerm).parse(search_term)

    query = Or([a_query, b_query, c_query, d_var_query, d_fuzz_query])
    results = searcher.search(query, limit=None)
    print(results)
    for res in results:
        print(res)

Но в моей модели django все документы, которые я добавляю выше, CharField выглядят следующим образом:

class ModelLetters(modes.model):
    a = models.CharField(max_length=50)
    b = models.CharField(max_length=100)
    c = models.CharField(max_length=100)
    d = models.CharField(max_length=250)

Тогда как мой индекс стога сена следующий (все CharField тоже):

from haystack import indexes
from appmanager.model.model_letters import ModelLetters


class LettersIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    a = indexes.CharField(model_attr="a")
    b = indexes.CharField(model_attr="b")
    c = indexes.CharField(model_attr="c")
    d = indexes.CharField(model_attr="d")

    class Meta:
      model = ModelLetters
      fields = ["a", "b", "c", "d"]


    def get_model(self):
        return ModelLetters

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()
Вернуться на верх