1

私は現在、ユーザーが名、姓、または電子メールで人を検索する必要がある検索を開発しています。検索には、Solr 4.0.0-ALPHA と edismax クエリを使用しています。

私が抱えている問題は、ユーザーが部分的な電子メールでユーザーを検索する場合、その部分的な電子メール クエリと完全に一致する一致のみを返す必要があることです。

クエリの例: lastname@gmail

「lastname@gmail」に一致するユーザーのみを返す必要があります。

例: firstname.lastname@gmail.com

しかし、代わりに、「lastname@gmail」に一致するものが 1 つしかない場合、「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>

私が行っている検索は次のとおりです。

/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 に答える