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

Я пытаюсь выполнить поиск в solr, но хочу отдать приоритет поиску поля (например, заголовка) над совпадением в других полях, таких как «Директора». Это часть моего schema.xml

<fields>
    <field name="Id" type="string" indexed="true" stored="true" required="true"/>
    <field name="Title" type="text_general" indexed="true" stored="true"/>
    <field name="OriginalTitle" type="text_general" indexed="true" stored="true"/>
    <field name="Directors" type="text_general" indexed="true" stored="true" multiValued="true" required="false"/>
    <field name="Language" type="text_general" indexed="false" stored="true" required="false"/>
    <field name="text" type="text_general" indexed="true" stored="false" multiValued="true"/>
</fields>

<uniqueKey>Id</uniqueKey>

<defaultSearchField>text</defaultSearchField> 

<solrQueryParser defaultOperator="OR"/> 

<copyField source="Title" dest="text"/>
<copyField source="OriginalTitle" dest="text"/>
<copyField source="Directors" dest="text"/>
<copyField source="Keywords" dest="text"/>

Это мой обработчик запросов:

<lst name="responseHeader">
  <int name="status">0</int>
  <int name="QTime">2</int>
  <lst name="params">
    <str name="lowercaseOperators">true</str>
    <str name="pf">Title^100 Directors^10</str>
    <str name="indent">true</str>
    <str name="q">fo*</str>
    <str name="qf">Title Directors</str>
    <str name="stopwords">true</str>
    <str name="wt">xml</str>
    <str name="defType">edismax</str>
  </lst>
</lst>

И мой результат был:

<result name="response" numFound="4" start="0">
  <doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Footloose</str>
    <arr name="Directors">
      <str>Herbert Ross</str>
    </arr>
    <str name="OriginalTitle">Footloose (1984)</str>
</doc>
  <doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Amadeus</str>
    <arr name="Directors">
      <str>Milos Forman</str>
    </arr>
    <str name="OriginalTitle">Amadeus</str>
</doc>
  <doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Forrest Gump</str>
    <arr name="Directors">
      <str>Robert Zemeckis</str>
    </arr>
    <str name="OriginalTitle">Forrest Gump</str>
</doc>
  <doc>
    <str name="Language">Doblado al español</str>
    <str name="Title">Chimpancés</str>
    <arr name="Directors">
      <str>Alastair Fothergill</str>
      <str> Mark Linfield</str>
    </arr>
    <str name="OriginalTitle">Chimpanzee Esp</str>
</doc>
</result>

но я хочу этот результат:

<result name="response" numFound="4" start="0">
  <doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Footloose</str>
    <arr name="Directors">
      <str>Herbert Ross</str>
    </arr>
    <str name="OriginalTitle">Footloose (1984)</str>
</doc>
  <doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Forrest Gump</str>
    <arr name="Directors">
      <str>Robert Zemeckis</str>
    </arr>
    <str name="OriginalTitle">Forrest Gump</str>
</doc>
<doc>
    <str name="Language">Ingles subtítulos español</str>
    <str name="Title">Amadeus</str>
    <arr name="Directors">
      <str>Milos Forman</str>
    </arr>
    <str name="OriginalTitle">Amadeus</str>
</doc>
  <doc>
    <str name="Language">Doblado al español</str>
    <str name="Title">Chimpancés</str>
    <arr name="Directors">
      <str>Alastair Fothergill</str>
      <str> Mark Linfield</str>
    </arr>
    <str name="OriginalTitle">Chimpanzee Esp</str>
</doc>
</result>

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

ОБНОВЛЕНИЕ: по поводу debug=True я получил такой результат:

<lst name="debug">
<str name="rawquerystring">fo*</str>
<str name="querystring">fo*</str>
<str name="parsedquery">
(+DisjunctionMaxQuery((Directors:fo* | Title:fo*)) () ())/no_coord
</str>
<str name="parsedquery_toString">+(Directors:fo* | Title:fo*) () ()</str>
<lst name="explain">
<str name="10">
1.0 = (MATCH) sum of: 1.0 = (MATCH) max of: 1.0 = (MATCH) ConstantScore(Title:fo*), product of: 1.0 = boost 1.0 = queryNorm
</str>
<str name="2">
1.0 = (MATCH) sum of: 1.0 = (MATCH) max of: 1.0 = (MATCH) ConstantScore(Directors:fo*), product of: 1.0 = boost 1.0 = queryNorm
</str>
<str name="12">
1.0 = (MATCH) sum of: 1.0 = (MATCH) max of: 1.0 = (MATCH) ConstantScore(Title:fo*), product of: 1.0 = boost 1.0 = queryNorm
</str>
<str name="711">
1.0 = (MATCH) sum of: 1.0 = (MATCH) max of: 1.0 = (MATCH) ConstantScore(Directors:fo*), product of: 1.0 = boost 1.0 = queryNorm
</str>
</lst>
<str name="QParser">ExtendedDismaxQParser</str>
<null name="altquerystring"/>
<null name="boost_queries"/>
<arr name="parsed_boost_queries"/>
<null name="boostfuncs"/>
<lst name="timing">
<double name="time">4.0</double>
<lst name="prepare">
<double name="time">1.0</double>
<lst name="query">
<double name="time">1.0</double>
</lst>
<lst name="facet">
<double name="time">0.0</double>
</lst>
<lst name="mlt">
<double name="time">0.0</double>
</lst>
<lst name="highlight">
<double name="time">0.0</double>
</lst>
<lst name="stats">
<double name="time">0.0</double>
</lst>
<lst name="debug">
<double name="time">0.0</double>
</lst>
</lst>
<lst name="process">
<double name="time">3.0</double>
<lst name="query">
<double name="time">0.0</double>
</lst>
<lst name="facet">
<double name="time">0.0</double>
</lst>
<lst name="mlt">
<double name="time">0.0</double>
</lst>
<lst name="highlight">
<double name="time">0.0</double>
</lst>
<lst name="stats">
<double name="time">0.0</double>
</lst>
<lst name="debug">
<double name="time">3.0</double>
</lst>
</lst>
</lst>
</lst>

person shinjidev    schedule 06.05.2013    source источник


Ответы (2)


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

<str name="pf">Title^100 Directors^10</str>
<str name="qf">Title Directors</str>

Попробуйте указать те же веса в поле qf.

person Alexandre Rafalovitch    schedule 07.05.2013
comment
Спасибо, это работает для меня. Теперь мне нужно выяснить, как уменьшить приоритет слов вроде to, a и других :) - person shinjidev; 07.05.2013
comment
Вот что такое StopFilterFactory. Я думаю, что ваша конфигурация по умолчанию уже использует его, возможно, вам просто нужно добавить больше слов, которые вы хотите игнорировать. Но да, это будет отдельный вопрос. - person Alexandre Rafalovitch; 07.05.2013

вы должны попытаться сделать объяснение (но debug=true или debugQuery=true для строки запроса), чтобы увидеть, какие элементы запроса оцениваются. Похоже, что это может быть термин частота или что-то в этом роде, что имеет значение. Это также может привести к связи между документами, поскольку у вас не так много контента.

person Klaus Petersen    schedule 06.05.2013