2012-09-04 21 views
5

Se ho un record con le parole chiave Chris Muench, voglio essere in grado di far corrispondere Mue o Chr. Come posso fare questo con una query solr. Attualmente faccio la seguente:Ricerca con caratteri jolly Solr

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

Non corrisponde Mue o Chr, ma non corrisponde Muench

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

Questioni SO correlate, con ulteriori suggerimenti, qui: http://stackoverflow.com/questions/1974394/apache-solr-search-part-of-the-word/1976045#1976045 –

risposta

7

È necessario usare sia per wildcard queries esempio chr * o mue * che corrisponderebbero.
Questo client potrebbe inserire la query in questo formato o modificarla nell'applicazione.
Altrimenti, è possibile generare token utilizzando solr.EdgeNGramFilterFactory e questo corrisponderebbe ai record. per esempio. chris genererebbe ch, chr, chri, chris e quindi corrisponderebbe a tutte queste combinazioni.

+0

Ho provato a fare: $ results = $ solr-> search ('"'. Apache_Solr_Service :: escape ($ _ GET ['textsearch']). '*" ~ 100', 0, 100, array ('fq' => 'type: datacollection')); e ancora non combacia. Preferirei farlo nella query di ricerca e NON utilizzare NGramFilterFactory, –

+1

il problema con le query con caratteri jolly è che non devono essere analizzati durante il tempo di interrogazione e quindi potrebbero non corrispondere. Prova a cercare lettere minuscole in modo da avere una minuscola nell'analisi del tempo dell'indice. – Jayendra

+0

Anche questo non sembra essere d'aiuto. Devo fare qualcosa nel mio schema? –