Solr/Dismax с динамическими полями

Я только что добавил несколько динамических полей с подстановочными знаками в свою схему solr:

<dynamicField name="*_s" type="string" indexed="true" stored="true"/>

Затем я добавляю документ с именем поля, например asdfasdf_s

Если я делаю запрос, который вызывает этот документ, я вижу, что asdfasdf_s сохраняется в результатах с установленным значением.

Однако, если я ищу по значению в этом динамическом поле, я не получаю никаких результатов. Я использую анализатор запросов dismax.


person latj    schedule 20.01.2012    source источник


Ответы (1)


Скорее всего, это связано с тем, что для типа поля типа ваших динамических полей установлено значение string. По умолчанию строковый тип поля, как показано ниже, не слишком удобен для поиска, поскольку с ним не связаны никакие индексы или анализаторы времени запроса.

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

Я бы посоветовал вам изменить тип поля на что-то вроде text_general, как показано ниже.

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

Поскольку text_general лучше подходит для запроса поля, поскольку он токенизирует, переводит в нижний регистр и предоставляет синонимы для добавляемых к нему значений. Одним из быстрых способов получить те же преимущества без изменения типа поля для динамики является использование copyField, чтобы скопировать ваши динамические значения в тип поля text_general или в какой-либо другой тип поля, который лучше использовать для запросов.

person Paige Cook    schedule 21.01.2012
comment
@user623324 user623324, другими словами, тип данных string хранит строки как есть и может выполнять только совпадения «равно» (равно ли asdfasdf_s еде). Тип text_general сохраняет (если вы его установили) и индексирует его; сделать его доступным для поиска (есть ли упоминание о «еде» или «еде» в asdfasdf_s). Вам могут понадобиться свойства обоих типов, поэтому сохраняйте две копии с помощью copyField. - person Jesvin Jose; 21.01.2012