Solr:具有完全匹配的部分电子邮件搜索

时间:2012-08-24 00:03:29

标签: solr

我目前正在开发一种搜索,用户需要使用他们的名字,姓氏或电子邮件来搜索他人。对于搜索我正在使用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 =真

1 个答案:

答案 0 :(得分:0)

从#solr irc-channel我得到了如何正确解决这个问题的答案。通过向字段添加autoGeneratePhraseQueries = true,它将查询放在双引号中,我得到了正确的答案。

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