Подтвердить что ты не робот

Как определить тип поля для индексации SOLR?

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

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

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

Спасибо

4b9b3361

Ответ 1

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.)