Question

I'm trying to search in solr but I want to prioritize the search for a field (i.e. Title) over the match in other fields like "Directors". This is part of my 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"/>

This is my request handler:

<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>

And my result was:

<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>

but i want this 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>

What should i do in my query to get the response that i want??

UPDATE: About the debug=True, i got this result:

<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>
Was it helpful?

Solution

You are boosting your Phrase Field matches, but not your Query Field matches. You probably want to boost all, especially since your search is not actually a phrase:

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

Try putting the same weights on the qf field.

OTHER TIPS

you should try to do an explain (but debug=true or debugQuery=trueto the querystring) to see what elements of the query scores. It looks like it might be the term frequency or such which makes the difference. It might also bo an tie between documents as you do not have a lot of content

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top