простая конфигурация django / haystack / solr - проблема частичного совпадения полей - PullRequest
0 голосов
/ 03 февраля 2010

У меня есть простая конфигурация 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)

из шаблонов / поиска / индексов / systems_management / device_text.txt для этого приложения (имена всех jibe)

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

Проблема:

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

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>

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

0 голосов
/ 06 февраля 2010

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

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

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

...