2015-08-08 3 views
1

У меня есть несколько документов, индексированных в Solr. Когда я запрашиваю с использованием q=*:*, я получаю все документы, но когда я отправляю какое-либо слово в q, я не получаю никаких результатов. Ниже приведен фрагмент схемы.xmlЗапрос Solr возвращает 0 результатов

<?xml version="1.0" ?> 


<schema name="default" version="1.5"> 
    <types> 
    <fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> 
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true" omitNorms="true"/> 
    <fieldtype name="binary" class="solr.BinaryField"/> 


    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> 
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> 
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> 
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" sortMissingLast="true" positionIncrementGap="0"/> 
    <!-- <fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> 
    <fieldType name="slong" class="solr.SortableLongField" sortMissingLast="true" omitNorms="true"/> 
    <fieldType name="sfloat" class="solr.SortableFloatField" sortMissingLast="true" omitNorms="true"/> 
    <fieldType name="sdouble" class="solr.SortableDoubleField" sortMissingLast="true" omitNorms="true"/> --> 

    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> 
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> 
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> 
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" omitNorms="true" positionIncrementGap="0"/> 

    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0"/> 
    <!-- A Trie based date field for faster date range queries and date faceting. --> 
    <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/> 

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/> 
    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> 
    <fieldtype name="geohash" class="solr.GeoHashField"/> 

    <fieldType name="text" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

    <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" /> --> 
     <!-- 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" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 

     </analyzer> --> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    </fieldType> 

    <fieldType name="text_en" class="solr.TextField" positionIncrementGap="100"> 
     <!-- <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> --> 
     <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: 
      <filter class="solr.EnglishMinimalStemFilterFactory"/> 
     --> 
     <!-- <filter class="solr.PorterStemFilterFactory"/> --> 
     <!-- </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.EnglishPossessiveFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> --> 
     <!-- Optionally you may want to use this less aggressive stemmer instead of PorterStemFilterFactory: 
      <filter class="solr.EnglishMinimalStemFilterFactory"/> 
     --> 

     <!-- <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> --> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    </fieldType> 

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

    <fieldType name="ngram" class="solr.TextField" > 
     <analyzer type="index"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" /> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     </analyzer> 
    </fieldType> 
    </types> 

    <fields> 
    <!-- general --> 
    <field name="id" type="string" indexed="true" stored="true" multiValued="false" required="true"/> 
    <field name="django_ct" type="string" indexed="true" stored="true" multiValued="false"/> 
    <field name="django_id" type="string" indexed="true" stored="true" multiValued="false"/> 
    <field name="_version_" type="long" indexed="true" stored ="true"/> 

    <dynamicField name="*_i" type="int" indexed="true" stored="true"/> 
    <dynamicField name="*_s" type="string" indexed="true" stored="true"/> 
    <dynamicField name="*_l" type="long" indexed="true" stored="true"/> 
    <dynamicField name="*_t" type="text_en" indexed="true" stored="true"/> 
    <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> 
    <dynamicField name="*_f" type="float" indexed="true" stored="true"/> 
    <dynamicField name="*_d" type="double" indexed="true" stored="true"/> 
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/> 
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/> 
    <dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false"/> 


    <field name="content" type="text_en" indexed="true" stored="true" multiValued="false" /> 

    <field name="title" type="text_en" indexed="true" stored="true" multiValued="false" /> 

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

    <field name="image" type="text_en" indexed="true" stored="true" multiValued="false" /> 

    <field name="short_desc" type="text_en" indexed="true" stored="true" multiValued="false" /> 

    <field name="pub_date" type="text_en" indexed="true" stored="true" multiValued="false" /> 

    </fields> 

    <!-- field to use to determine and enforce document uniqueness. --> 
    <uniqueKey>id</uniqueKey> 

    <!-- field for the QueryParser to use when an explicit fieldname is absent --> 
    <defaultSearchField>text</defaultSearchField> 

    <!-- SolrQueryParser configuration: defaultOperator="AND|OR" --> 
    <solrQueryParser defaultOperator="OR"/> 
</schema> 

Что я могу делать неправильно?

РЕДАКТИРОВАТЬ

Ниже приведен пример документа индексируется в Solr.

Indexed Solr Document

А вот запрос я побежал, что дал мне 0 результат:

Debug Query

Как вы можете ясно видеть, что документ имеет Индия упоминается. Поэтому этот документ должен быть возвращен. Что-то не так сгенерированный запрос?

ответ

1

Либо вы должны будете пожаробежите ваш запрос на имя поля, как показано ниже

q =: content: india

или вам придется, чтобы определить значения по умолчанию поля для поиска по пустой строке запроса для выбора обработчика в solrconfig файл, как показано ниже

<requestHandler name="/select" class="solr.SearchHandler"> 
     <!-- default values for query parameters can be specified, these 
       will be overridden by parameters in the request 
      --> 
     <lst name="defaults"> 
      <int name="rows">10</int> 
      <str name="qf">content short_description</str> 
     </lst> 
    </requestHandler> 
1

В таких случаях я бы добавил параметр debugQuery = true в свой http-запрос. Отображаемая информация включает в себя то, как Solr видит параметр q, чтобы вы могли получить то, что не так. Съемка в темноте Я полагаю, что документы на самом деле не индексированы или вы используете неправильный синтаксический анализатор запросов (например, *: * недействительный запрос для DisMax)

После того, как сообщение опубликовано, я вижу странную вещь (но может быть, я мог бы быть неправильно, я читаю эту looong почту от моего мобильного телефона):

ничего не заполняет поле «текст» ...

документа, который вы ищете имеет «Индия» term в поле «content», но df (поле по умолчанию, используемое в запросах) - это «текст», поэтому это правильное поведение, ничего не соответствует «india» в «text», потому что «текст» пуст. Вы можете сделать одно из следующих действий:

  • изменения поля по умолчанию от текста к содержанию
  • явно назвать поле контента в запросе (например, содержание: ИНДИЯ)
  • Declare директивы copyField с SRC = содержанием и ДСТ = текст
+0

Пожалуйста, смотрите редактирование моего ответа – Andrea

1

было бы хорошо, если бы вы разделили определение типа поля, как и в будет токенизатор используется, что все фильтры используются и т.д. ...

Если вы использовали ключевое слово tokenizer, которое является токенизатором, который обрабатывает все текстовое поле как один токен.

Попробуйте использовать StandardTokenizerFactory или WhitespaceTokenizerFactory.

В случае WhitespaceTokenizerFactory, токенизатор, который разбивает текстовый поток на пробелы и возвращает последовательности символов без пробелов в качестве токенов. Обратите внимание, что любая пунктуация будет включена в токенизацию.

Если входной поток: «Успех Дня Республики в Индии»

Выход: «The», «успех», «из», «Республика», «День», «в», «Индия»

Опять же, если вы добавите фильтр, например фильтр с прокруткой или фильтр нижнего регистра, который будет снова хорош.

В качестве примера

<fieldType name="text" class="solr.TextField"> 
    <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Здесь конечный результат будет отличаться

Если входной поток: «Успех Дня Республики в Индии»

Выход: «» , "success", "of", "Republic", "day", "in", "india"

и теперь вы можете запросить «Индию», а также «Индию» ... она получит матч

, потому что при индексировании вы индексировали его как «Индию», а во время запроса у вас есть фильтр нижнего регистра, который сделает его «инди», даже если текст поиска «Индия».

На вершине ее, если добавить стопслов Завод фильтров

он не будет индексировать такие слова, как: «из», «в» и «в» и поиск по этим словам не имеет смысла (его мое мнение, может отличаются от других).

Solr предоставил веб-интерфейс, в котором вы можете анализировать свои типы полей, кто индексирует поток ... что вам нужно изменить, чтобы вы получили правильный результат.

Я надеюсь, что это помогает ...

Для получения дополнительной информации о всех tokenizers и фильтров, пожалуйста, посмотрите на него ..

https://cwiki.apache.org/confluence/display/solr/Tokenizers#Tokenizers-WhiteSpaceTokenizer

https://cwiki.apache.org/confluence/display/solr/Filter+Descriptions

+0

Я обновил этот вопрос с целая схема. Сделал изменения, предложенные вами. Все еще получается 0 результатов. –

+0

Вы не изменили fieldType для поля "text". После этого вам нужно повторно проиндексировать одно и то же ... В настоящее время я вижу, что тип текста по-прежнему «text_en», а не текст ... Измените то же самое и сообщите мне, если он работает для вас или нет ... –