Haystack не возвращает результаты, которые выделяет Solr Admin Console - PullRequest
1 голос
/ 15 апреля 2011

Я недавно настроил solr и haystack для поиска одной из моих моделей django. Я попытался изменить схему solr по умолчанию, созданную haystack, для использования NGramTokenizerFactory:

<fieldType name="text" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" />
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" />
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

В моей базе данных есть несколько записей из одного или двух слов, которые я бы хотел сопоставить с запросом пользователя. Например, у меня может быть один объект с заголовком «собака», а другой - с заголовком «кошка». Если пользователь ищет «собачью кошку», то я хотел бы вернуть объекты «собака» и «кошка» для этого запроса.

Точно так же, если я ищу «мой крутой сайт», я бы хотел, чтобы поле «сайт» было возвращено.

Я попытался использовать интерфейс администратора solr, чтобы убедиться, что мои запросы совпадают. Там вроде все нормально enter image description here: Проблема в том, что я использую интерфейс поиска по умолчанию в стоге сена для поиска того же запроса: enter image description here

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

Спасибо за любую помощь / предложения, если это лучший способ выполнить такой поиск.

1 Ответ

1 голос
/ 15 апреля 2011

Несколько месяцев назад я работал с django-haystack и solr. У меня также были проблемы с выполнением некоторых специальных запросов для решения. На самом деле это должно быть решено добавлением следующей строки к settings.py:

HAYSTACK_DEFAULT_OPERATOR = 'OR' # actually has no effect...

Но у меня это не работает.

Итак, в моем случае это было решено с помощью подкласса SearchView класса. Это небольшой фрагмент моего проекта:

# views.py:
from haystack.views import SearchView

class PeriodicalSearchView(SearchView):
  def get_results(self):
    """
    Fetches the results via the form.
    Returns an empty list if there's no query to search with.
    """
    if not (self.form.is_valid() and self.form.cleaned_data['q']):
        return self.form.no_query_found()

    query = self.form.cleaned_data['q']

    words = iter(set(query.split()))
    word = words.next()
    sqs = self.form.searchqueryset.filter(text=word) # actually I have one more field here...
    for word in words:
        sqs = sqs.filter_or(title=word).filter_or(text=word)

    if self.load_all:
        sqs = sqs.load_all()

    return sqs

  def __call__(self, request, template_name=None):
    """
    Generates the actual response to the search.
    Relies on internal, overridable methods to construct the response.
    """
    if template_name:
        self.template = template_name

    return super(PeriodicalSearchView, self).__call__(request)

И urls.py

# urls.py:
from .views import PeriodicalSearchView

urlpatterns = patterns('',
    url(r'^search/$', PeriodicalSearchView(template='template_search.html'), 
    name='haystack_search'),
)

И это все.

...