2012-09-04 10 views
5

Wenn ich einen Datensatz mit Keywords Chris Muench habe, möchte ich in der Lage sein, Mue oder Chr anzupassen. Wie kann ich das mit einer solr-Abfrage machen? Zur Zeit habe ich folgendes:Solr Wildcard-Suche

$results = $solr->search('"'.Apache_Solr_Service::escape($_GET['textsearch']).'"~100', 0, 100, array('fq' => 'type:datacollection')); 

Es spielt keine Mue oder Chr übereinstimmen, aber es Muench überein

Schema:

<?xml version="1.0" encoding="UTF-8" ?> 
<schema name="rocdocs" version="1.4"> 
    <types> 
    <!-- The StrField type is not analyzed, but indexed/stored verbatim. --> 
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> 
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/> 
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <!-- in this example, we will only use synonyms at query time 
     <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
     --> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
     <tokenizer class="solr.StandardTokenizerFactory"/> 
     <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> 
     <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 
</types> 


<fields> 
    <field name="type" type="string" indexed="true" stored="true" required="true" /> 
    <field name="mongo_id" type="string" indexed="true" stored="true" required="true" /> 
    <field name="nid" type="int" indexed="true" stored="true" required="true" /> 
    <field name="keywords" type="text_general" indexed="true" stored="false" /> 
</fields> 

<!-- Field to use to determine and enforce document uniqueness. 
     Unless this field is marked with required="false", it will be a required field 
    --> 
<uniqueKey>mongo_id</uniqueKey> 

<!-- field for the QueryParser to use when an explicit fieldname is absent --> 
<defaultSearchField>keywords</defaultSearchField> 
<!-- SolrQueryParser configuration: defaultOperator="AND|OR" --> 
<solrQueryParser defaultOperator="OR"/> 
</schema> 
+0

Verwandte SO Frage, mit zusätzlichen Tipps, hier: http://stackoverflow.com/questions/1974394/apache-solr-search-part-of-the-word/1976045#1976045 –

Antwort

7

Sie müssen entweder verwenden wildcard queries z.B. chr * oder mue *, die übereinstimmen würden.
Dies würde entweder Client die Abfrage in diesem Format eingeben oder in der Anwendung ändern.
Andernfalls können Sie Tokens mit solr.EdgeNGramFilterFactory generieren und dies würde die Datensätze übereinstimmen. z.B. chris würde ch, chr, chri, chris erzeugen und würde daher alle diese Kombinationen zusammenbringen.

+0

Ich versuchte zu tun: $ Ergebnisse = $ solr-> search ('' '. Apache_Solr_Service :: escape ($ _ GET [' textsearch ']).' * "~ 100 ', 0, 100, Array (' fq '=>' Typ: Datensammlung ')); und es stimmt immer noch nicht überein. Ich würde es vorziehen, dies in der Suchabfrage tun und nicht verwenden NGramFilterFactory, –

+1

das Problem mit Platzhalter Abfragen ist, dass sie keine Analyse während der Abfrage Zeit durchlaufen und daher möglicherweise nicht übereinstimmen. Versuchen Sie, in Kleinbuchstaben nach Kleinbuchstaben in der Indexzeitanalyse zu suchen. – Jayendra

+0

Das schien auch nicht zu helfen. Muss ich etwas in meinem Schema tun? –