web-dev-qa-db-fra.com

Requête générique Solr avec des espaces

J'ai une requête générique qui ressemble à quelque chose comme:

q=location:los a*

J'aimerais qu'il soit assorti à "los angeles" et "los altos". Une requête comme:

q=los*

Fonctionne très bien, mais dès que j'ajoute des espaces, je n'ai aucun résultat. Comment puis-je utiliser des espaces dans mes requêtes génériques?

20
tbaz

J'ai récemment rencontré ce problème moi-même et il semble que tout ce que vous avez à faire est d'échapper à l'espace de votre requête. Votre requête originale serait interprétée par Solr comme suit:

location:los id:a*

(en supposant que "id" est votre champ de recherche par défaut)

Cependant, si vous deviez écrire votre requête en tant que:

location:los\ a*

Ensuite, il serait analysé comme suit:

location:los a*

Et ce qui précède devrait donner les résultats souhaités (en supposant que vos données soient correctement indexées).

Astuce: Comprendre tout cela est simple. Ajoutez simplement &debugQuery=on à la fin de l’URL que vous utilisez lors de la soumission de votre requête pour voir comment elle a été analysée par Solr.

31
Aubergine

Solution à votre problème en utilisant un analyseur de requête complexe:

q={!complexphrase inOrder=true}location:"los a*"

Pour en savoir plus sur l'analyseur syntaxique complexe, consultez ce lien! https://cwiki.Apache.org/confluence/display/solr/Other+Parsers#OtherParsers-ComplexPhraseQueryParser

2
Jaikumar

Puis-je suggérer le plug-in de requête de préfixe solr si vous ne l'utilisez que pour des caractères génériques sur le suffixe tel que nous étions http://lucene.Apache.org/solr/4_0_0/solr-core/org/Apache/solr/search/ PrefixQParserPlugin.html

exemple d'utilisation

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi

correspondrait à "Bob Smith" ou "Bob Smit" mais ne serait pas converti en un chèque de ("Bob" OR "Smi *"), comme ce serait le cas si vous utilisiez la première solution que vous pourriez envisager dans le sens suivant: q=name:Bob%20Smi*

J'espère que cela vous aidera ou aidera quelqu'un d'autre à rechercher une solution simple, car je me suis cogné la tête contre un mur pendant des heures avant de trouver cela!

1
Rob

Sans voir votre configuration, utilisez plutôt un KeywordTokenizerFactory car vous marquez probablement un espace maintenant.

0
Okke Klein

J'ai eu le même problème dans mon projet. À chaque fois que je cherchais un mot avec les espaces, je n'obtenais pas le résultat. J'ai donc remplacé les espaces par un trait d'union "-" lors de l'indexation et de l'interrogation. Vous trouverez ci-dessous le snipet schema.xml que j'avais l'habitude de faire:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
 <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
</fieldType>
0
Rizwan Khan

Pour moi a travaillé

<fieldtype name="text_like" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    </analyzer>
</fieldtype>

et interrogez field:*some\ phrase* (en Java, il faut échapper\as \\).

0
Oleg Efimov

Je pense que vous devriez utiliser la config comme ça

  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement=""   replace="all" />
    </analyzer>
  </fieldType>

et vous devez gérer votre mot-clé d'entrée pour la recherche comme supprimer les espaces

0
Anh Tuan

La requête (en supposant que vous ayez un tokenizer d’espace): Q = emplacement: los a * Signifie que vous recherchez un document avec le mot "los" et un mot commençant par "a"

Solr (autant que je sache) ne peut pas déterminer si un mot (ou un terme) apparaît avant un autre.

0
shem