Подтвердить что ты не робот

Как сделать частичное полевое совпадение с помощью Haystack?

Мне нужен простой инструмент поиска для моего сайта, основанного на django, поэтому я пошел с Haystack и Solr. Я правильно настроил все и могу найти правильные результаты поиска, когда я набираю точную фразу, но я не могу получить никаких результатов при вводе частичной фразы.

Например: "Джон" возвращает "John Doe", но "Joh" ничего не возвращает.

Модель:

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

Индекс поиска:

class PersonIndex(SearchIndex):
    text = CharField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')

site.register(Person, PersonIndex)

Я предполагаю, что некоторые параметры отсутствуют, что позволяет выполнять частичное сопоставление полей. Я видел, как люди говорили о EdgeNGramFilterFactory() на некоторых форумах, и я его искал, но я не совсем уверен в его реализации. Кроме того, я надеялся, что это будет конкретный способ сена, если я когда-нибудь отключу поисковый сервер.

4b9b3361

Ответ 1

Вы можете добиться такого поведения, создав поле вашего индексного поля EdgeNgramField:

class PersonIndex(SearchIndex):
    text = EdgeNgramField(document=True, use_template=True)
    first_name = CharField(model_attr = 'first_name')
    last_name = CharField(model_attr = 'last_name')

Ответ 2

В дополнение к подсказке EdgeNgramField, о которой упоминалось на этой странице, и, конечно, NgramField, если вы работаете с азиатскими языками), я думаю, стоит упомянуть, что в Django_haystack вы можете запускать необработанные запросы на Solr с помощью следующей команды:

from haystack.query import SearchQuerySet
from haystack.inputs import Raw
SearchQuerySet().filter(text=Raw(query))

где text - это поле, которое вы хотите найти, а query может быть любым, основанным на синтаксисе запроса Parser (версия 3.6, или 4.6) Lucene.

Таким образом, вы можете легко установить запрос на ABC* или ABC~ или что-нибудь еще, что подходит для синтаксиса.

Ответ 3

У меня была аналогичная проблема при поиске неанглийских слов, например:

ABC
ABCD

Если я хочу найти ключевые слова ABC, я ожидаю два вышедших результата. Я смог добиться следующего, переведя ключевое слово в нижний регистр и используя startswith:

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())

Ответ 4

У меня была такая же проблема, и единственный способ получить результаты, которые я хотел, - это изменить конфигурационный файл solr, чтобы включить фильтрацию ngram, поскольку токенизатор по умолчанию основан на пробеле. Поэтому вместо NGramTokenizer. Мне бы очень хотелось узнать, есть ли способ сена, чтобы сделать то же самое.

Я сейчас не на своей машине, но это должно сделать трюк.

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />

Ответ 5

@riz Я еще не могу прокомментировать, или я бы это сделал, и я знаю, что это старый комментарий, но на случай, если кто-то еще пройдет мимо этого: Убедитесь, что manage.py update_index

Blockquote @Liarez, как вы это заработали? Я использую haystack/elastic search, и я не смог заставить его работать.