2015-03-31 2 views
5

В настоящее время я работаю с SolrJ API для нашего веб-приложения. Нам нужно иметь несколько слов в приложении. Но я не знаю, как это сделать.Как сделать поиск нескольких слов в SOLRJQuery

Вот код, который мы разработали до сих пор, ища в Интернете.

HttpSolrClient solr = new HttpSolrClient("http://localhost:8983/solr/Test"); 
SolrQuery query = new SolrQuery();   
query.setQuery("product_name:Dell laptop*"); 
query.setFields("product_name"); 
query.setStart(0); 
query.setRows(1000); 

QueryResponse response = solr.query(query); 
SolrDocumentList results = response.getResults(); 
for (int i = 0; i < results.size(); ++i) { 
    System.out.println(results.get(i)); 
} 

Но я не получаю никакого результата. У нашего Solr есть слияние mongo DB с помощью админ-консоли apache Solr, работающей на порту 8983.

Пожалуйста, помогите. Я новичок в apache SOLR.

Update: Вот schema.xml мы создали

<?xml version="1.0" encoding="UTF-8" ?> 

<schema name="example" version="1.5"> 

    <field name="_version_" type="long" indexed="true" stored="true"/> 
    <field name="_root_" type="string" indexed="true" stored="false"/> 
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" /> 
    <field name="product_name" type="string" indexed="true" stored="true" required="true" multiValued="true"/> 
    <field name="product_url" type="string" indexed="true" stored="true" required="true" multiValued="true"/> 
    <field name="product_img" type="string" indexed="true" stored="true" required="true" multiValued="true"/> 
    <field name="product_price" type="double" indexed="true" stored="true" required="true" multiValued="true"/> 

    <dynamicField name="*_i" type="int" indexed="true" stored="true"/> 
    <dynamicField name="*_is" type="int" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_s" type="string" indexed="true" stored="true" /> 
    <dynamicField name="*_ss" type="string" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_l" type="long" indexed="true" stored="true"/> 
    <dynamicField name="*_ls" type="long" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_t" type="text_general" indexed="true" stored="true"/> 
    <dynamicField name="*_txt" type="text_general" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_en" type="text_en" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> 
    <dynamicField name="*_bs" type="boolean" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_f" type="float" indexed="true" stored="true"/> 
    <dynamicField name="*_fs" type="float" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_d" type="double" indexed="true" stored="true"/> 
    <dynamicField name="*_ds" type="double" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_coordinate" type="tdouble" indexed="true" stored="false" /> 
    <dynamicField name="*_dt" type="date" indexed="true" stored="true"/> 
    <dynamicField name="*_dts" type="date" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="*_p" type="location" indexed="true" stored="true"/> 
    <dynamicField name="*_ti" type="tint" indexed="true" stored="true"/> 
    <dynamicField name="*_tl" type="tlong" indexed="true" stored="true"/> 
    <dynamicField name="*_tf" type="tfloat" indexed="true" stored="true"/> 
    <dynamicField name="*_td" type="tdouble" indexed="true" stored="true"/> 
    <dynamicField name="*_tdt" type="tdate" indexed="true" stored="true"/> 
    <dynamicField name="*_c" type="currency" indexed="true" stored="true"/> 
    <dynamicField name="ignored_*" type="ignored" multiValued="true"/> 
    <dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/> 
    <dynamicField name="random_*" type="random" /> 
    <uniqueKey>id</uniqueKey> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> 
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/> 
    <fieldType name="tint" class="solr.TrieIntField" precisionStep="8" positionIncrementGap="0"/> 
    <fieldType name="tfloat" class="solr.TrieFloatField" precisionStep="8" positionIncrementGap="0"/> 
    <fieldType name="tlong" class="solr.TrieLongField" precisionStep="8" positionIncrementGap="0"/> 
    <fieldType name="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/> 
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/> 
<fieldType name="tdate" class="solr.TrieDateField" precisionStep="6" positionIncrementGap="0"/> 
    <fieldType name="binary" class="solr.BinaryField"/> 
    <fieldType name="random" class="solr.RandomSortField" indexed="true" /> 

    <fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     </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" /> 
     <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> 
    </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"/> 
     <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"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 
     <fieldType name="text_en_splitting" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
     <analyzer type="index"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" 
       ignoreCase="true" 
       words="lang/stopwords_en.txt" 
       /> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <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.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_en_splitting_tight" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
     <analyzer> 
     <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_en.txt"/> 
     <filter class="solr.WordDelimiterFilterFactory" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/> 
     <filter class="solr.EnglishMinimalStemFilterFactory"/> 
     <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="text_general_rev" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     <filter class="solr.ReversedWildcardFilterFactory" withOriginal="true" 
      maxPosAsterisk="3" maxPosQuestion="2" maxFractionAsterisk="0.33"/> 
     </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="stopwords.txt" /> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

    <fieldType name="alphaOnlySort" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
     <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     <filter class="solr.TrimFilterFactory" /> 
     <filter class="solr.PatternReplaceFilterFactory" 
       pattern="([^a-z])" replacement="" replace="all" 
     /> 
     </analyzer> 
    </fieldType> 

    <fieldType name="lowercase" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
     <tokenizer class="solr.KeywordTokenizerFactory"/> 
     <filter class="solr.LowerCaseFilterFactory" /> 
     </analyzer> 
    </fieldType> 

    <fieldType name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" /> 

    <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/> 

    <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> 

    <fieldType name="location_rpt" class="solr.SpatialRecursivePrefixTreeFieldType" 
     geo="true" distErrPct="0.025" maxDistErr="0.001" distanceUnits="kilometers" /> 

    <fieldType name="bbox" class="solr.BBoxField" 
       geo="true" distanceUnits="kilometers" numberType="_bbox_coord" /> 
    <fieldType name="_bbox_coord" class="solr.TrieDoubleField" precisionStep="8" docValues="true" stored="false"/> 

    <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" /> 

</schema> 

А вот данные,-config.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<dataConfig> 
    <dataSource name="client_XXXX" type="MongoDataSource" database="client_XXXX" host="192.168.11.XXX" port="27017"/> 
    <document name="Titles"> 
     <entity name="TitleEntity" 
     processor="MongoEntityProcessor" 
       query="" 
       collection="XXXX_data" 
       datasource="client_XXXX" 
       transformer="MongoMapperTransformer" > 
       <field column="product_name" name="product_name"/> 
       <field column="product_url" name="product_url"/>   
       <field column="product_img" name="product_img"/> 

       <field column="product_price" name="product_price"/> 

     <field column="_id" name="id"/> 
     </entity> 
    </document> 
</dataConfig> 
+0

Вы получаете какие-либо результаты при выполнении этого с 'query.setQuery ("*: *");' и закомментируйте 'query.setFields (товар "PRODUCT_NAME");'? Запрос '* *: *" 'вернет весь индекс, чтобы убедиться, что у вас есть документы. – cheffe

+0

@cheffe, я получил результат при использовании 'query.setQuery ("*: *"); и однословный запрос работает правильно, например, поиск ** dell **. то, что я ищу, - это получить результаты, которые имеют ** ** dell ** и ** laptop **, если мы будем искать ** «dell laptop» ** – Joju

+0

@cheffe Я также добавил файл схемы. Мы создали этот файл, используя один из примеров из файла solr sever dowloaded. Пожалуйста, проверьте, нет ли какой-либо ошибки. – Joju

ответ

1

Мы создали новый schema.xml, удаляя ненужные ссылки здесь схемы мы использовали.

<schema name="example" version="1.5"> 

<field name="_version_" type="long" indexed="true" stored="true"/> 
<field name="_root_" type="string" indexed="true" stored="false"/> 

     <fields>  
     <field name="id" type="long" indexed="true" stored="true" required="true" multiValued="false" /> 
     <field name="product_name" type="string" indexed="true" stored="true" required="true" /> 
     <field name="product_price" type="" indexed="true" stored="true" required="true" /> 

    </fields> 
    <uniqueKey>id</uniqueKey> 
    <types> 
       <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> 
       <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> 
       <fieldType name="text_wslc" class="solr.TextField" positionIncrementGap="100"> 
         <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="tdouble" class="solr.TrieDoubleField" precisionStep="8" positionIncrementGap="0"/> 
       <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> 
       <fieldType name="tdate" class="solr.TrieDateField" omitNorms="true" precisionStep="6" positionIncrementGap="0"/> 
     <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/> 
    </types> 

     <defaultSearchField>product_name</defaultSearchField> 

     <!-- we don't want too many results in this usecase --> 
     <solrQueryParser defaultOperator="AND"/> 

      </schema> 
1

То, что вы работаете в упомянута в JavaDoc Lucene. Почему Луцен? Синтаксис запроса Solr - это надмножество Lucene. As mentioned there

Примечание: Поле действует только на срок, что он непосредственно предшествует, так что название запроса

: Сделайте это прямо

Останется только найти «Do» в поле заголовка. Он найдет «это» и «право» в поле по умолчанию (в этом случае текстовое поле).

В вашем случае только Dell направлена ​​на поле корпуса PRODUCT_NAME, остальное направляется в поле поиска по умолчанию, определенных в конфигурации.

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

SolrQuery query = new SolrQuery();   
query.setQuery("product_name:(Dell laptop*)"); // surround the words with (...) 
query.setFields("product_name"); 
query.setStart(0); 
query.setRows(1000); 
+0

Спасибо за ответ.Я получаю результаты, но его отображение всего 13 выходов, в то время как фактический используемый mongodb имеет результат 1000+. @cheffe ** _ Поле группировки _ ** вещь, похоже, не оказывает большого влияния на «SolrQuery». Есть ли альтернатива для объекта «SolrQuery». – Joju

+0

Нет, альтернативы нет. Это объект, предназначенный для использования. Когда вы видите меньше результатов, тогда ожидаете, что пришло время перейти на страницу/admin вашего сервера solr и исправить запрос. Я уверен, что у вас есть недостатки в вашем анализаторе для поля product_name. – cheffe

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