Как сделать частичное совпадение полей с помощью стога сена? - PullRequest
19 голосов
/ 08 декабря 2010

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

Например: «Джон» возвращает «Джон Доу», но «Джо» ничего не возвращает.

Модель:

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() на некоторых форумах, и я погуглил их, но я не совсем уверен в их реализации. Кроме того, я надеялся, что найдется способ, специфичный для стога сена, на случай, если я когда-нибудь выключу бэкэнд поиска.

Ответы [ 5 ]

16 голосов
/ 18 апреля 2013

Вы можете добиться такого поведения, сделав текстовое поле вашего индекса 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 голосов
/ 22 мая 2013

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

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

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

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

1 голос
/ 15 июня 2011

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

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

<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="15" />
1 голос
/ 01 апреля 2011

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

ABC
ABCD

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

keywords = 'ABC'
results.filter(code__startswith=keywords.lower())
0 голосов
/ 21 мая 2015

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

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

...