Схема 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()