2012-09-04 35 views
5

Nếu tôi có bản ghi với từ khóa Chris Muench, tôi muốn có thể khớp với Mue hoặc Chr. Làm thế nào tôi có thể làm điều này với một truy vấn solr. Hiện nay tôi làm như sau:Tìm kiếm ký tự đại diện Solr

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

Nó không phù hợp với Mue hoặc Chr, nhưng nó không phù hợp với 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

Câu hỏi SO liên quan, với các mẹo bổ sung, tại đây: http://stackoverflow.com/questions/1974394/apache-solr-search-part-of-the-word/1976045#1976045 –

Trả lời

7

Bạn cần phải sử dụng một trong hai ví dụ wildcard queries chr * hoặc mue * phù hợp.
Điều này sẽ là khách hàng hoặc nhập truy vấn ở định dạng này hoặc sửa đổi nó trong ứng dụng.
Khác, bạn có thể tạo mã thông báo bằng cách sử dụng solr.EdgeNGramFilterFactory và điều này sẽ khớp với các bản ghi. ví dụ. chris sẽ tạo ra ch, chr, chri, chris và do đó sẽ phù hợp với tất cả các kết hợp này.

+0

Tôi đã thử thực hiện: $ results = $ solr-> search ('"'. Apache_Solr_Service :: escape ($ _ GET ['textearch']). '*" ~ 100', 0, 100, mảng ('fq' => 'type: datacollection')); và nó vẫn không khớp. Tôi muốn làm điều này trong truy vấn tìm kiếm và không sử dụng NGramFilterFactory, –

+1

vấn đề với các truy vấn ký tự đại diện là chúng không trải qua phân tích trong thời gian truy vấn và do đó có thể không khớp. Hãy thử tìm kiếm trường hợp thấp hơn khi bạn có trường hợp thấp hơn trong phân tích thời gian chỉ mục của mình. – Jayendra

+0

Điều đó dường như không giúp được gì. Tôi có cần phải làm điều gì đó trong lược đồ của mình không? –

Các vấn đề liên quan