SOLR не ищет на определенных полях - PullRequest
6 голосов
/ 11 ноября 2009

Только что установил Solr, отредактировал schema.xml и теперь пытаюсь проиндексировать его и выполнить поиск по нему с некоторыми тестовыми данными.

В файле XML, который я отправляю в Solr, одно из моих полейвыглядит следующим образом:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>

Там есть HTML, поэтому я завернул его в CDATA.

В моем Solr schema.xml определение для этого поля выглядит так:

<field name="PageContent" type="text" indexed="true" stored="true"/>

Когда я запустил инструмент POSTing, все прошло нормально, но когда я ищу контент, который, как мне известно, находится внутри поля PageContent, я не получаю результатов.

Однако, когда яустановите для узла <defaultSearchField> значение PageContent, все работает.Но если я установлю его в любое другое поле, оно не будет искать в PageContent.

Я что-то не так делаю?в чем проблема?

Чтобы уточнить ошибку:

Я загрузил «документ» со следующими данными:

<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>

В своей схеме я определил поля как таковые:

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/>
<field name="PageName" type="text" indexed="true" stored="true"/>
<field name="PageContent" type="text" indexed="true" stored="true"/>

И:

<uniqueKey>PageID</uniqueKey>
<defaultSearchField>PageName</defaultSearchField>

Теперь, когда я использую инструмент администрирования Solr и ищу "some name", я получаю результат.Но, если я ищу "html content", "html", "content" или "928", я не получаю результатов

Почему?

Ответы [ 5 ]

7 голосов
/ 13 ноября 2009

Вы упомянули, что ваше поле поиска по умолчанию установлено в PageName, я не ожидаю, что поиск по "содержимому" что-либо выдаст.

Вы, вероятно, хотели поместить «PageContent: content» в поле поиска, чтобы найти данные в этом поле. Если вы хотите выполнить поиск по нескольким полям, вы можете проверить это http://wiki.apache.org/solr/DisMaxRequestHandler. Консоль администратора Solr не настолько хороша, как инструмент для работы со всеми параметрами поиска DisMax, вам нужно просто манипулировать URL для этого.

Несмотря на это, я согласен с предыдущим постером: если ваши настройки анализа не настроены должным образом для работы с HTML, вы, вероятно, получите всевозможные неожиданные результаты поиска. Уберите HTML и индексируйте только текст.

Если вы хотите, чтобы ваш стандартный обработчик запросов осуществлял поиск по всем вашим полям, вы можете изменить его в своем файле solrconfig.xml (я всегда добавляю второй обработчик запросов вместо изменения "стандартного". Поле qf - это список полей, которые вы хотите искать против. Это разделенный пробелами список.

<requestHandler name="standard" class="solr.DisMaxRequestHandler">

     <lst name="defaults">
            <str name="echoParams">all</str>
            <str name="hl">true</str>

            <str name="fl">*</str>
            <str name="qf">PageName PageContent</str>
     </lst>

 </requestHandler>
1 голос
/ 26 мая 2010

fl - это список полей, возвращаемых запросом. qf - это список, на который вы хотите сослаться, и он не поддерживает подстановочные знаки.

Единственный способ поиска по всем полям без их включения - это иметь copyField, который перехватывает все значения (не хранятся только в индексированном виде), а затем имитирует поиск по всем полям путем поиска по нему

1 голос
/ 11 ноября 2009

Вы проверяете, что ваши данные были зафиксированы, прежде чем пытаться найти их, верно?

Кроме того, если вы хотите хранить необработанный HTML, возможно, лучше удалить HTML. Вы можете сделать это в своем приложении или с помощью solr. Solt. HTLStripWhitespaceTokenizerFactory, например:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

Который вы объявляете в своем определении типа поля для «текста». Возможно, вы захотите создать новый тип поля только для вашего HTML, может быть что-то вроде text_html, и вы можете использовать его так:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
      <analyzer type="index"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
          <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
          <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
          <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
          <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
          <filter class="solr.LowerCaseFilterFactory"/> 
          <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
          <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
      </analyzer> 
    </fieldtype> 

Я не уверен, что вы подразумеваете под:

Однако, когда я устанавливаю узел в PageContent, все работает. Но если я установлю это в любое другое поле, он не ищет в PageContent.

Не могли бы вы уточнить?

0 голосов
/ 10 февраля 2011

Параметр fl делает не , задает поля для запроса, но поля для возврата в ответе.

Вы можете просто добавить к schema.xml:

<field name="fieldContainingEverything"  type="text" indexed="true" stored="true"   multiValued="true" />

 <defaultSearchField>fieldContainingEverything</defaultSearchField>

 <copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>

Теперь при индексации каждое поле копируется в fieldContainingEverything. Проблема здесь в том, что вы теряете поле, из которого поступает контент, если вы хотите дополнительно оценить эту информацию. Я был бы рад, если бы кто-то имел представление об этом.

<ч />

Я нашел несколько функциональное решение:

Чтобы описать сценарий немного подробнее: у меня есть таблица базы данных MySQL с большим количеством полей для индексации, и я делаю это, просто импортируя каждое поле без указания каждого поля (SELECT * FROM ...). Я хочу запросить индекс для каждого поля таблицы и узнать, какое поле соответствует запросу. Это невозможно из коробки, так как маркер просто сообщает, что поле, соответствующее запросу, равно fieldContainingEverything. Используя обработчик запросов dismax , я обнаружил, что, хотя говорят, что он выполняет поиск в каждом поле, я, похоже, не получаю его для поиска по полям, которые не указаны в параметре qf. Идея теперь состоит в том, чтобы дополнительно проиндексировать каждое поле, добавив:

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

к вашему schema.xml. Теперь, когда вы запрашиваете Solr через dismax с hl.true&hl.fl=*, вы добавляете qf=fieldContainingEverything^1 в свой список параметров. Solr теперь просматривает каждое проиндексированное поле, но также выделяет каждое поле, содержащее термин запроса. Недостатком этих методов, очевидно, является увеличенный размер индекса, который в большинстве случаев не должен быть таким значимым.

0 голосов
/ 20 октября 2010

В моем schema.xml есть что-то вроде следующего, которое копирует значение каждого поля, заканчивающегося _t, в текстовое поле

<defaultSearchField>text</defaultSearchField>
<copyField source="*_t" dest="text" maxChars="3000"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...