2010-02-03 3 views
0

J'ai une config simple botte de foin/Solr sur mon application django:django/botte de foin/Solr simple, config - problème de correspondance des champs partielle

du models.py de cette application:

class device(models.Model): 
    ... 
    hostname = models.CharField(max_length=45, help_text="The hostname for this device") 
    ... 

de l'search_sites.py de cette application:

class devIndex(indexes.SearchIndex): 
    '''Haystack class to allow for indexing device objects in TOMS''' 
    text = indexes.CharField(document=True, use_template=True) 

à partir de modèles/Recherche/index/systems_management/device_text.txt fo cette application (noms tous empannage)

... 
{{ object.hostname }} 
... 

Le problème:

un système est nommé static1.foo.com:

si je recherche « statique », j'obtenir des résultats pour tous les serveurs statiques (« statique » est dans leurs champs de description)

si je recherche « static1 », je reçois 0

si je recherche « static1.foo.com » J'obtiens des résultats, y compris ce serveur. Ma question est, pourquoi est-ce que haystack/solr ne correspond pas à la requête "static1"?

Répondre

0

Il s'agit probablement d'un problème d'analyse. Je suppose que vous utilisez le StandardTokenizer dans votre fichier schema.xml pour ce champ.

Le tokenizer standardise les noms d'hôtes en un seul jeton. (ref: http://www.lucidimagination.com/search/document/CDRG_ch05_5.5.1), vous ne pouvez donc le faire correspondre qu'avec le nom d'hôte complet.

Si vous souhaitez effectuer une recherche par morceaux, vous devez utiliser un marqueur différent. Le champ de texte par défaut dans l'exemple Solr utilise le filtre WhitespaceTokenizer et WordDelimeter, qui divise le nom d'hôte. Cela vous permettra de trouver par la requête de 'static1'.

+0

Merci pour l'entrée. Je vois où cela est écrit dans le fichier schema.xml de la config. J'ai effectué mon schema.xml comme suit: Je rebâti puis mon index, mais je me fais toujours pas de résultats sur la recherche d'un nom d'hôte partiel: ... static1 ... Je n'arrive pas à comprendre ce qui me manque (sinon). – jduncan

0

Solr a plusieurs configurations possibles. Pour votre cas d'utilisation, vous pouvez utiliser un ngram de bord dans votre fichier schema.xml. Voici un exemple:

<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="4" maxGramSize="15" side="front" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory" /> 
    <filter class="solr.LowerCaseFilterFactory" /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/> 
    </analyzer> 

Utilisez cet exemple et ruser un peu jusqu'à ce qu'il retourne les résultats souhaités.

Questions connexes