我目前正在开发一种搜索,用户需要使用他们的名字,姓氏或电子邮件来搜索他人。对于搜索我正在使用Solr 4.0.0-ALPHA和edismax查询。
我遇到的问题是,如果用户使用部分电子邮件搜索用户,我只需要返回与该部分电子邮件查询完全匹配的匹配项。
例如查询:lastname @gmail
应仅返回与“lastname @ gmail”匹配的用户。
例如:firstname.lastname@gmail.com
但现在它匹配匹配“lastname”或“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:lastname@gmail | id:lastname@gmail | (email:lastname email:gmail) | firstName:lastname@gmail)
</str>
我希望它更像这样做,当我使用双引号“lastname @ gmail”进行查询时会发生这种情况:
<str name="parsedquery_toString">
+(lastName:lastname@gmail | id:lastname@gmail | email:"lastname gmail" | firstName:lastname@gmail)
</str>
以下是我正在进行的搜索:
/选择Q =姓氏@ Gmail和安培; QF = ID +的firstName + lastName的+电子邮件&安培; DEFTYPE = edismax&安培; debugQuery =真
答案 0 :(得分:0)
从#solr irc-channel我得到了如何正确解决这个问题的答案。通过向字段添加autoGeneratePhraseQueries = true,它将查询放在双引号中,我得到了正确的答案。
<fieldType name="text_email" class="solr.TextField" sortMissingLast="true" omitNorms="true" autoGeneratePhraseQueries="true">