私は現在、ユーザーが名、姓、または電子メールで人を検索する必要がある検索を開発しています。検索には、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