1

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

4

1 回答 1

-1

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

<fieldType name="text_email" class="solr.TextField" sortMissingLast="true" omitNorms="true" autoGeneratePhraseQueries="true">
于 2012-08-29T00:17:41.660 回答