Comment avoir Solr la saisie semi-automatique sur l'ensemble de la phrase lorsque la requête contient plusieurs termes?

J'ai regardé à travers une tonne d'exemples et d'autres questions ici et à partir d'eux, j'ai ma config très proche de ce dont j'ai besoin, mais je suis en manque un petit peu que je vais avoir un diable de temps de travail. Je suis à la recherche sur des valeurs comme:

solar powered
solar glass
solar globe
solar lights
solar magic
solid brass
solid copper

Ce que je veux:

  1. Si je recherche pour sol le résultat devrait inclure l'ensemble de ces valeurs. Les travaux de cette.
  2. Si je recherche pour solar je devrais obtenir seulement les cinq premiers. Les travaux de cette.
  3. Si je recherche pour solar gl je devrais obtenir seulement solar glass et solar globe. Cela ne fonctionne pas. Au lieu de cela, j'ai obtenu une série de matches pour les solar et une deuxième série de matches pour les gl.

En un mot, je veux tenir compte de la contribution de la chaîne dans son ensemble, indépendamment de n'importe quel espace. Je déduis ceci est accompli par la création d'une requête distincte (par rapport à l'indice) de l'analyseur, mais je n'ai pas été capable de le faire fonctionner. Quelqu'un peut-il suggérer une configuration qui vous permettra d'obtenir de moi ce que je suis à la recherche d'?

J'ai (sans succès) essayé:

  • L'interrogation avec "solar gl"
  • L'interrogation avec mm=100%
  • Définition distincte de la requête et de l'indice des analyseurs à la fois à l'aide de KeywordTokenizerFactory. (Je ne sais pas ce que le diable je pensais que serait faire).
  • La définition d'un indice de l'analyseur, mais pas un analyseur de requêtes.
  • La définition d'un analyseur de requêtes sans tokenizer.

Voici mon schéma actuel:

<field name="suggest_phrase" type="suggest_phrase"
    indexed="true" stored="false" multiValued="false" />

Et la définition d'un champ:

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

Et la config:

<searchComponent name="suggest_phrase" class="solr.SpellCheckComponent">
    <lst name="spellchecker">
        <str name="name">suggest_phrase</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.fst.FSTLookup</str>
        <str name="field">suggest_phrase</str>
        <str name="buildOnCommit">true</str>
    </lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest_phrase">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest_phrase</str>
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.count">10</str>
        <str name="spellcheck.collate">false</str>
    </lst>
    <arr name="components">
        <str>suggest_phrase</str>
    </arr>
</requestHandler>
Avez-vous essayé ma solution?
Ajouter le shingle filter à votre type de champ Bardeaux Filtre fieldType.
Ok, juste essayé, mais ça ne me donne pas ce que je cherche. Si j'ai une requête pour green coffee j'ai toujours revenir à deux sets de matchs, l'un pour le mot green et une autre pour le mot coffee. (Ces match individuel définit ensuite contenir les "galets".) Ce que je suis à la recherche pour obtenir une liste uniquement les documents qui contiennent l'expression exacte green<space>coffee et pas "green" OR "coffee".

OriginalL'auteur Alex Howansky | 2013-08-08