0

この ssql クエリで%は、AGAINST句で a を使用しています。

            SELECT firstname,lastname,middlename,company_name, 
                    primary_emailaddress,alternate_emailaddress,personal_address_line1,
                    personal_address_line2,personal_address_city,facebook_username,
                    twitter_username,googleplus_username,linkedin_username,
                    personal_website_url,birthday_month,notes,personal_address_zipcode,
                    company_address_zipcode,home_phonenumber,company_phonenumber,
                    cell_phonenumber,birthday_day,birthday_year,hash,image_file
             FROM contacts
             WHERE (
                MATCH(
                    firstname,middlename,lastname,
                    primary_emailaddress,alternate_emailaddress,personal_address_line1,
                    personal_address_city,company_name,
                    company_address_line1,company_address_city,
                    facebook_username,twitter_username,googleplus_username,linkedin_username,
                    personal_website_url,birthday_month,notes
                )
                AGAINST ('someemail@email.com%' IN BOOLEAN MODE) 
                OR personal_address_zipcode REGEXP('(someemail@email.com*)') 
                OR company_address_zipcode REGEXP('(someemail@email.com*)') 
                OR home_phonenumber REGEXP('(someemail@email.com*)') 
                OR company_phonenumber REGEXP('(someemail@email.com*)') 
                OR cell_phonenumber REGEXP('(someemail@email.com*)') 
                OR birthday_day REGEXP('(someemail@email.com*)') 
                OR birthday_year REGEXP('(someemail@email.com*)') 
            ) 
            AND addressbook_id = 4

この ssql クエリで*は、AGAINST句で a を使用しています。

            SELECT firstname,lastname,middlename,company_name, 
                    primary_emailaddress,alternate_emailaddress,personal_address_line1,
                    personal_address_line2,personal_address_city,facebook_username,
                    twitter_username,googleplus_username,linkedin_username,
                    personal_website_url,birthday_month,notes,personal_address_zipcode,
                    company_address_zipcode,home_phonenumber,company_phonenumber,
                    cell_phonenumber,birthday_day,birthday_year,hash,image_file
             FROM contacts
             WHERE (
                MATCH(
                    firstname,middlename,lastname,
                    primary_emailaddress,alternate_emailaddress,personal_address_line1,
                    personal_address_city,company_name,
                    company_address_line1,company_address_city,
                    facebook_username,twitter_username,googleplus_username,linkedin_username,
                    personal_website_url,birthday_month,notes
                )
                AGAINST ('someemail@email.com*' IN BOOLEAN MODE) 
                OR personal_address_zipcode REGEXP('(someemail@email.com*)') 
                OR company_address_zipcode REGEXP('(someemail@email.com*)') 
                OR home_phonenumber REGEXP('(someemail@email.com*)') 
                OR company_phonenumber REGEXP('(someemail@email.com*)') 
                OR cell_phonenumber REGEXP('(someemail@email.com*)') 
                OR birthday_day REGEXP('(someemail@email.com*)') 
                OR birthday_year REGEXP('(someemail@email.com*)') 
            ) 
            AND addressbook_id = 4

どちらも、コンテンツが atleast と正確に等しい場所だけを返しませんsomeemail@email.com。comやemailなどですべてを返しています。どのような変更を加える必要がありますか? 一致列にはFULLTEXT索引があります。

4

2 に答える 2

1

アドレスを引用符で囲み、ワイルドカードをまったく使用しないことをお勧めします。

AGAINST ('"someemail@email.com"' IN BOOLEAN MODE)

そのように。

そして、これにはブールモードは必要ないと思います。

于 2013-07-31T20:29:17.260 に答える
0

@and .(実際にはほとんどの英数字以外の文字) は単語の区切り記号であるため、全文検索は機能しません。したがって、1. 電子メールは 3 つの個別の単語として索引付けされ、2. 単語区切り文字は検索文字列から無視されます。

列に通常の複数列インデックスを作成し、標準で検索するだけLIKEです:

WHERE firstname LIKE 'someemail@email.com%' OR ...

このクエリはインデックスを使用できるようになり、検索が非常に効率的になります。

また、これらを取り除きますREGEXP()。それらは役に立たず (冗長)、パフォーマンスを低下させます (インデックスは使用できません)。

于 2013-07-31T21:17:55.080 に答える