Solr suggestions with ContextField: not all objects have that field

747 Views Asked by At

So I have a database indexed in solr, and I'm trying to filter the search suggestions(suggester) using ContextField/cfq. What I am trying to do is filter the suggestion queries to either elements that have the context field (a boolean field) set to false, or that don't have the field.Using just false doesn't work, I'm not sure how to formulate it inside the suggest.cfq field inside solrconfig.xml, since the field is already declared as a contextfield and it doesn't seem like I can do (-myfield:[* TO *] AND :) OR myfield:false. How to do what I want to do?

The relevant chunk of solrconfig.xml:

<searchComponent name="suggest" class="solr.SuggestComponent">
 <lst name="suggester">
    <str name="name">composerSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/composerSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">composers_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">pieceSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/pieceSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">pieces_searchable</str>
    <str name="weightField">price</str>
    <str name="contextField">hidden</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">collectionSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/collectionSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">collections_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">languageSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/languageSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">languages_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">genreSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/genreSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">genres_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">locationSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/locationSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">locations_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">sourceSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/sourceSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">sources_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">instrumentSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/instrumentSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">instruments_voices_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
 <lst name="suggester">
    <str name="name">tagSuggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions/tagSuggest_dict</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">tags_searchable</str>
    <str name="weightField">price</str>
    <str name="suggestAnalyzerFieldType">suggestTypeLc</str>
    <str name="buildOnStartup">true</str>
    <str name="buildOnCommit">false</str>
    <str name="highlight">false</str>
 </lst>
</searchComponent>
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" >
 <lst name="defaults">
   <str name="suggest">true</str>
   <str name="suggest.count">15</str>
   <str name="suggest.cfq">(-hidden:[* TO *] AND *:*) OR hidden:false</str>
</lst>
<arr name="components">
  <str>suggest</str>
</arr>

1

There are 1 best solutions below

0
On

Hope it helps someone.

Specify contextField in the suggester component(pieceSuggest suggester in your case). For <str name="contextField">hidden</str> change the cfq field value in requestHandler as :

 <str name="suggest.cfq">-true</str>

It should give all the suggest fields having false or no value of hidden field