2012-08-24 72 views
1

我目前正在開發一種搜索,用戶需要通過其名字,姓氏或他們的電子郵件搜索人員。對於搜索,我使用的是Solr 4.0.0-ALPHA和edismax查詢。Solr:使用完全匹配的部分電子郵件搜索

我遇到的問題是,如果用戶使用部分電子郵件搜索用戶,我只需要返回與該部分電子郵件查詢完全匹配的匹配項。

例如查詢:名字@ gmail的

應返回只匹配 「姓氏@ gmail的」 用戶。

例如:[email protected]

,但現在相反,它所有的比賽匹配要麼「姓」或「Gmail」,這在我們的數據庫中就會有結果的數量龐大,當只有一個這將匹配「lastname @ gmail」。我知道,如果我用雙引號進行查詢,比如「lastname @ gmail」,我可以得到完全匹配的結果,我當然可以在將搜索發送到Solr之前強制將此電子郵件地址轉換爲此格式,但是否可行在schema.xml中以某種方式做到這一點。

這裏是我當前的schema.xml

<schema name="example" version="1.5"> 
    <fields> 
     <field name="id" type="string" indexed="true" stored="true" required="true" /> 
     <field name="firstName" type="string_ci" indexed="true" stored="true" /> 
     <field name="lastName" type="string_ci" indexed="true" stored="true" /> 
     <field name="email" type="string_email" indexed="true" stored="true" /> 
    </fields> 

    <uniqueKey>id</uniqueKey> 

    <types> 
     <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> 

     <fieldType name="string_ci" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
      <analyzer> 
       <tokenizer class="solr.KeywordTokenizerFactory" /> 
       <filter class="solr.LowerCaseFilterFactory" /> 
      </analyzer> 
     </fieldType> 

     <fieldType name="string_email" class="solr.TextField" sortMissingLast="true" omitNorms="true"> 
      <analyzer> 
       <tokenizer class="solr.StandardTokenizerFactory" /> 
       <filter class="solr.LowerCaseFilterFactory" /> 
       <filter class="solr.WordDelimiterFilterFactory" /> 
      </analyzer> 
     </fieldType> 
    </types> 
</schema> 

我知道,這個問題就在這裏,我使用StandardTokenizerFactory,其將電子郵件地址令牌和執行查詢時,它分析本查詢:

<str name="parsedquery_toString"> 
+(lastName:[email protected] | id:[email protected] | (email:lastname email:gmail) | firstName:[email protected]) 
</str> 

在那裏我會希望它做更多這樣的,當我做查詢用雙引號「姓氏@ gmail的」恰巧:

<str name="parsedquery_toString"> 
+(lastName:[email protected] | id:[email protected] | email:"lastname gmail" | firstName:[email protected]) 
</str> 

這是我做的是搜索:

/選擇Q =姓氏@ gmail的& QF = ID +的firstName + lastName的+電子郵件& DEFTYPE = edismax & debugQuery =真

+1

那麼,爲什麼你不改變電子郵件字段類型爲string_ci,它應該工作,因爲你想。 – Jayendra

+0

正如Jayendra所說,你爲什麼不發送'string_ci'類型的電子郵件,該類型使用KeywordTokenizer並且使查詢類似於'q = * lastname @ gmail *&qf = id + firstName + lastName + email&defType = edismax&debugQuery = true' –

+0

This將無法解決我的問題,因爲我仍然必須在那裏強制使用通配符。與強制引用雙引號相同。我也嘗試過solr.EdgeNGramFilterFactory,這有點幫助,但並沒有解決我真正的問題。 – Klaus

回答

0

而且從#solr irc通道我得到了答案如何正確解決這個問題。通過將autoGeneratePhraseQueries = true添加到字段,它將查詢放在雙引號中,並且我得到了正確的答案。

<fieldType name="text_email" class="solr.TextField" sortMissingLast="true" omitNorms="true" autoGeneratePhraseQueries="true">