Как определить тип поля для индексации SOLR? - PullRequest
16 голосов
/ 22 января 2010

У меня есть два поля таблицы в таблице MySQL. Одним из них является VARCHAR и является «заголовком» для классифицированных (сайт объявлений). Другое поле TEXT, которое содержит «текст» для классифицированного.

Два вопроса:
Как определить, как индексировать эти два поля? (какой тип поля, какие классы использовать и т. Д.)

В настоящее время у меня есть "ad_id" в качестве уникального идентификатора для каждого объявления, например, "bmw_m3_82398292".
Как я могу заставить SOLR возвращать этот идентификатор всякий раз, когда SOLR обнаруживает "запрос на совпадение"? (Первая часть идентификатора фактически является содержимым полей заголовка, вторая часть - выбранное случайное число)

Спасибо

1 Ответ

29 голосов
/ 22 января 2010

1. Схема

Ваша схема Solr во многом определяется вашим предполагаемым поведением при поиске. В вашем файле schema.xml вы увидите несколько вариантов, таких как «текст» и «строка». Они ведут себя по-разному.

<fieldtype name="string" class="solr.StrField" sortMissingLast="true"     omitNorms="true"/>

Тип строкового поля - буквальное совпадение строки. Он будет работать как == в операторе SQL.

<fieldtype name="text_ws"   class="solr.TextField"          positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  </analyzer>
</fieldtype>

Тип поля text_ws выполняет токенизацию. Однако большая разница в поле text заключается в фильтрах для стоп-слов, разделителей и нижнего регистра. Обратите внимание, как эти фильтры обозначены как для индекса Lucene, так и для запроса Solr. Поэтому при поиске в текстовом поле он адаптирует условия запроса, используя эти фильтры, чтобы помочь найти совпадение.

<fieldtype name="text"      class="solr.TextField"  positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter ..... />
    <filter ..... />
    <filter ..... />
  </analyzer>
</fieldtype>

Например, при индексации таких новостей, как новости, вы, возможно, захотите искать названия компаний и заголовки по-другому.

<field name="headline" type="text" />
<field name="coname" type="string" indexed="true" multiValued="false" omitNorms="true" />

Приведенный выше пример позволит вам выполнить поиск, подобный &coname:Intel&headline:processor+specifications, и получить совпадения, попадающие точно в истории Intel.

Если вы хотите найти диапазон

2. Поля результата

Вы можете определить стандартный набор возвращаемых полей в RequestHandler

<requestHandler name="mumble" class="solr.DisMaxRequestHandler" >
    <str name="fl">
        category,coname,headline
    </str>
</requestHandler>

Вы также можете определить нужные поля в строке запроса, используя параметр fl .:

/select?indent=on&version=2.2&q=coname%3AIn*&start=0&rows=10&fl=coname%2Cid&qt=standard

Вы также можете выбрать диапазоны в терминах запроса, используя синтаксис field:[x TO *]. Если вы хотите выбрать определенные объявления по дате, вы можете создать запрос с

ad_date:[20100101 TO 20100201]

в ваших условиях запроса. (Есть много способов поиска диапазонов, я представляю метод, который использует целые числа вместо класса Date.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...