2012-08-24 163 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">