Solr - Как увеличить поле в Solr?Не получается правильный запрос - PullRequest
3 голосов
/ 06 декабря 2011

Я использую Solr 1.4.1.Мне нужно повысить поле.Мой schema.xml выглядит следующим образом:

<?xml version="1.0" ?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

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

    <!-- Numeric field types that manipulate the value into
     a string value that isn't human-readable in its internal form,
     but with a lexicographic ordering the same as the numeric ordering,
     so that range queries work correctly. -->
    <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="date" class="solr.DateField" sortMissingLast="true" omitNorms="true"/>

    <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <!-- 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.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <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.WhitespaceTokenizerFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <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>

    <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" side="front" />
      </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" />

    <dynamicField name="*_i"  type="sint"    indexed="true"  stored="true"/>
    <dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/>
    <dynamicField name="*_l"  type="slong"   indexed="true"  stored="true"/>
    <dynamicField name="*_t"  type="text"    indexed="true"  stored="true"/>
    <dynamicField name="*_b"  type="boolean" indexed="true"  stored="true"/>
    <dynamicField name="*_f"  type="sfloat"  indexed="true"  stored="true"/>
    <dynamicField name="*_d"  type="sdouble" indexed="true"  stored="true"/>
    <dynamicField name="*_dt" type="date"    indexed="true"  stored="true"/>

    <field name="location_ad" type="text" indexed="true" stored="true" multiValued="false" />
    <field name="text" type="text" indexed="true" stored="true" multiValued="false" />
    <field name="location_ad_exact" type="string" indexed="true" stored="true" multiValued="false" />
    <field name="date_inserted" type="date" indexed="true" stored="true" multiValued="false" />
    <field name="zone_ad_exact" type="string" indexed="true" stored="true" multiValued="false" />
    <field name="country_ad" type="text" indexed="true" stored="true" multiValued="false" />
    <field name="job_description" type="text" indexed="true" stored="true" multiValued="false" />
    <field name="zone_ad" type="text" indexed="true" stored="true" multiValued="false" />
    <field name="job_title" type="text" 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="AND" />
</schema>

Мне нужно сделать следующее: Мне нужно уделить больше внимания полю "job_title".Если, например, я ищу слово «программист», мне нужно в первую очередь показать результаты, в которых «программист» в поле «job_title» упорядочен по дате, а затем результаты, содержащие слово «программист» вполе "job_description".Лучше сделать пример, мой английский не самый лучший в мире;)

У меня есть эти данные:

job_title                | job_description                    | date_inserted
programmer               | job for IT guys                    | 10-Nov-2011
IT Python                | for python programmer              | 12-Nov-2011
PHP programmer           | PHP programming                    | 08-Nov-2011

Мне нужно, например, при поиске слова "программист"«чтобы придать большее значение полю« job_title », но также показать в результатах документы, которые имеют слово« programmer »в поле« job_description ».Мне также нужно придать значение полю date_inserted, чтобы результаты выглядели так:

job_title                | job_description                    | date_inserted
programmer               | job for IT guys                    | 10-Nov-2011
PHP programmer           | PHP programming                    | 08-Nov-2011
IT Python                | for python programmer              | 12-Nov-2011

Я делаю запрос, подобный этому:

/?facet=on&sort=date_inserted+desc&fl=*+score&start=0&q=programmer&bf=job_title:programmer^1.50&facet.field=location_ad_exact&facet.field=zone_ad_exact&fq=django_ct:(myapp.jobsadstext)&rows=20

Норезультат этого запроса не тот, который мне нужен.

Может кто-нибудь дать мне подсказку о треке, по которому я должен следовать, чтобы достичь результата?

С наилучшими пожеланиями,

1 Ответ

2 голосов
/ 06 декабря 2011
  1. Вы должны использовать анализатор запросов DisMax 'defType = dismax'), чтобы использовать бустинг.
  2. Используйте параметр qf для запроса поля (в вашем примере вы используете функцию bf - boost)

http://wiki.apache.org/solr/DisMaxQParserPlugin#qf_.28Query_Fields.29

...