2010-01-22 7 views
16

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

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

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

Благодаря

ответ

29

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 

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

ad_date:[20100101 TO 20100201] 

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

+0

Знаете ли вы, где я могу найти «справочное руководство» по всем классам и атрибутам для этих типов полей? – 2010-01-25 09:50:33

+1

Обычно я начинаю с вики-страницы Solr http://wiki.apache.org/solr/, а классы Javadocs для классов расположены здесь: http://lucene.apache.org/solr/api/index.html. –

Смежные вопросы