我目前正在開發一種搜索,用戶需要通過其名字,姓氏或他們的電子郵件搜索人員。對於搜索,我使用的是Solr 4.0.0-ALPHA和edismax查詢。Solr:使用完全匹配的部分電子郵件搜索
我遇到的問題是,如果用戶使用部分電子郵件搜索用戶,我只需要返回與該部分電子郵件查詢完全匹配的匹配項。
例如查詢:名字@ gmail的
應返回只匹配 「姓氏@ gmail的」 用戶。
,但現在相反,它所有的比賽匹配要麼「姓」或「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 =真
那麼,爲什麼你不改變電子郵件字段類型爲string_ci,它應該工作,因爲你想。 – Jayendra
正如Jayendra所說,你爲什麼不發送'string_ci'類型的電子郵件,該類型使用KeywordTokenizer並且使查詢類似於'q = * lastname @ gmail *&qf = id + firstName + lastName + email&defType = edismax&debugQuery = true' –
This將無法解決我的問題,因爲我仍然必須在那裏強制使用通配符。與強制引用雙引號相同。我也嘗試過solr.EdgeNGramFilterFactory,這有點幫助,但並沒有解決我真正的問題。 – Klaus