2012-09-04 38 views
5

Si tengo un registro con las palabras clave Chris Muench, quiero poder coincidir con Mue o Chr. ¿Cómo puedo hacer esto con una consulta solr? Actualmente hago lo siguiente:Solr búsqueda de comodín

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

No coincide con Mue o Chr, pero no coincide con Muench

esquema:

<?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

Pregunta relacionada con SO, con consejos adicionales, aquí: http://stackoverflow.com/questions/1974394/apache-solr-search-part-of-the-word/1976045#1976045 –

Respuesta

7

Es necesario para cualquiera que use wildcard queries por ejemplo, chr * o mue * que coincidiría.
Esto permitiría que el cliente ingrese la consulta en este formato o la modifique en la aplicación.
De lo contrario, puede generar tokens utilizando solr.EdgeNGramFilterFactory y esto coincidiría con los registros. p.ej. Chris generaría ch, chr, chri, chris y, por lo tanto, combinaría todas estas combinaciones.

+0

Intenté hacer: $ results = $ solr-> search ('"'. Apache_Solr_Service :: escape ($ _ GET ['textsearch']). '*" ~ 100', 0, 100, array ('fq' => 'tipo: datacollection')); y todavía no coincide. Preferiría hacer esto en la consulta de búsqueda y NO usar NGramFilterFactory, –

+1

, el problema con las consultas con comodines es que no se analizan durante el tiempo de consulta y, por lo tanto, pueden no coincidir. Intente buscar minúsculas ya que tiene minúsculas en su análisis de tiempo índice. – Jayendra

+0

Eso tampoco pareció ayudar. ¿Debo hacer algo en mi esquema? –

Cuestiones relacionadas