django/haystack/solr simple config – проблема с частичным соответствием полей

У меня есть простая конфигурация haystack/solr в моем приложении django:

из models.py этого приложения:

class device(models.Model):
    ...
    hostname = models.CharField(max_length=45, help_text="The hostname for this device")
    ...

из search_sites.py этого приложения:

class devIndex(indexes.SearchIndex):
    '''Haystack class to allow for indexing device objects in TOMS'''
    text = indexes.CharField(document=True, use_template=True)

из templates/search/indexes/systems_management/device_text.txt для этого приложения (названия все смешные)

...
{{ object.hostname }}
...

Эта проблема:

система называется static1.foo.com:

если я ищу «статический», я получаю результаты для всех статических серверов («статические» находятся в их полях описания)

если я ищу "static1", я получаю 0 результатов

если я ищу «static1.foo.com», я получаю результаты, включая этот сервер.

мой вопрос: почему haystack/solr не соответствует запросу «static1»?


person jduncan    schedule 03.02.2010    source источник


Ответы (2)


Скорее всего проблема в анализах. Я предполагаю, что вы используете StandardTokenizer в файле schema.xml для этого поля.

Стандартный токенизатор токенизирует имена хостов как один токен. (ссылка: http://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1), поэтому его можно сопоставить только с полным именем хоста.

Если вы хотите искать по частям, вам нужно использовать другой токенизатор. Текстовое поле по умолчанию в примере Solr использует фильтры WhitespaceTokenizer и WordDelimeter, которые разделят имя хоста. Это позволит вам найти по запросу «static1».

person ThoughtfulHacking    schedule 05.02.2010
comment
Спасибо за отзыв. Я вижу, где это прописано в schema.xml из конфига. Я отредактировал свой schema.xml следующим образом: ‹имя поля=тип имени хоста=индексированный текст=истина хранится=истина многозначный=истина/> Затем я перестроил свои индексы, но по-прежнему не получаю результатов при поиске hostname: ‹response› ... ‹str name=q›static1 ... ‹result name=response numFound=0 start=0/› ‹/response› Я не могу понять, что (еще) мне не хватает. - person jduncan; 08.02.2010

Solr имеет множество возможных конфигураций. Для вашего варианта использования вы можете использовать пограничную ngram в вашем schema.xml. Вот пример:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front" />
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory" />
    <filter class="solr.LowerCaseFilterFactory" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
  </analyzer>

Используйте этот пример и немного настройте его, пока он не вернет желаемые результаты.

person e-satis    schedule 22.12.2011