【问题标题】:Solr: Partial email search with exact matchSolr:完全匹配的部分电子邮件搜索
【发布时间】:2012-08-24 00:03:29
【问题描述】:

我目前正在开发一种搜索功能,用户需要通过他们的名字、姓氏或电子邮件来搜索人们。对于搜索,我使用 Solr 4.0.0-ALPHA 和 edismax 查询。

我遇到的问题是,如果用户要使用部分电子邮件搜索用户,我只需要返回与该部分电子邮件查询完全匹配的匹配项。

例如查询:lastname@gmail

应该只返回匹配“lastname@gmail”的用户。

例如:firstname.lastname@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

【问题讨论】:

  • 那么你为什么不把电子邮件字段类型更改为 string_ci,它应该可以按你的意愿工作。
  • 正如 Jayendra 所说,你为什么不制作“string_ci”类型的电子邮件,它使用 KeywordTokenizer 并进行类似q=*lastname@gmail*&amp;qf=id+firstName+lastName+email&amp;defType=edismax&amp;debugQuery=true的查询
  • 这不会解决我的问题,因为我仍然必须在那里强制使用通配符。与在此处强制使用双引号相同。我还尝试了 solr.EdgeNGramFilterFactory ,它有所帮助,但并没有解决我的真正问题。

标签: solr


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2011-10-22
    • 2015-03-10
    • 2019-09-22
    相关资源
    最近更新 更多