我目前正在开发一种搜索,用户需要通过他们的名字、姓氏或电子邮件来搜索人们。对于搜索,我使用 Solr 4.0.0-ALPHA 和 edismax 查询。
我遇到的问题是,如果用户要使用部分电子邮件搜索用户,我只需要返回与该部分电子邮件查询完全匹配的匹配项。
例如查询:lastname@gmail
应该只返回匹配“lastname@gmail”的用户。
例如:名.姓@gmail.com
但现在它匹配所有匹配“姓氏”或“gmail”的所有结果,当只有一个匹配“姓氏@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>
这是我正在做的搜索:
/select?q=lastname@gmail&qf=id+firstName+lastName+email&defType=edismax&debugQuery=true