# Search with like operation from a table

**URL:** <https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523>\
**Category:** Rails\
**Created:** [January 18, 2006, 5:34pm UTC](https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523 "2006-01-18T17:34:27Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![thila](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@thila](https://www.ruby-forum.com/u/thila)\
**Post date:** [January 18, 2006, 5:34pm UTC](https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523/1 "2006-01-18T17:34:27Z")

</div>

I have a table with the list of business name and address in it. It may  
contain 1 million rows. The users want to look up into this table based  
on the business name. The simple solution is to use LIKE in mysql, but I  
am worried about performance, since the user load will be very high for  
this system.

Any suggestion on how to handle the potential performance issue? How can  
i use a search components (like lucene or something else) here? Does  
ruby have any in-built plugin or gems for search?

Thanks

---

<div class="post-metadata">

**Author:** ![thila](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@thila](https://www.ruby-forum.com/u/thila)\
**Post date:** [January 18, 2006, 6:03pm UTC](https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523/2 "2006-01-18T18:03:28Z")

</div>

Thila:

I’m no expert but let me give you an answer in two parts, the general  
and the specific.

MySQL was built for that sort of situation. It is not unusual. I used  
to run a db with 2.5 million rows and we could find any one row  
virtually instantly. I think you’ll be fine, just remember to build  
indexes.

With an index, the search is surprisingly undemanding. The indexes  
work in a binary way. Say you are looking for the letter ‘C’ from all  
the letters in the alphabet. As best I understand it, it starts by  
grabbing the middle letter ‘m’. too high it says, let’s half what’s  
left, that is roughly the letter ‘F’, too high, it says (again),I’ll  
half what is left, which is ‘C’ and voila. Three steps to find one  
from 26.

Now more mathematically it take n search steps where the number of  
records is 2^n. And that is a remarkable series. 2^5 = 32, 2^10 =  
1024 and 2^20 = just over 1,000,000 - the number of rows you’ll  
have. So it is only twice as hard for MySQL to find one row in a  
million as it is for it to find one row in 1000. And if your db  
swells to 2 million records, then it will take 21 steps instead of  
20. Another 5% effort to find something in 100% more records.

bruce

---

<div class="post-metadata">

**Author:** ![thila](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@thila](https://www.ruby-forum.com/u/thila)\
**Post date:** [January 18, 2006, 6:12pm UTC](https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523/3 "2006-01-18T18:12:33Z")

</div>

Except that the SQL fragment thila is envisioning probably looks  
similar to: “… business\_name like ‘%SEARCH%’ …”  
(or ["… business\_name like ‘%?%’ …", params[:search] ] 😉

An index isn’t going to help you much there, except that the db  
engine may be able to search the business\_name index rather than the  
table itself.

Don’t be “worried” about a “potential performance issue” – just be  
“aware”.

Wait and see how the query really performs before you decide that  
it’s an “ISSUE”. You may be surprised!

-Rob

---

<div class="post-metadata">

**Author:** ![thila](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/3d9bf3/32.png) [@thila](https://www.ruby-forum.com/u/thila)\
**Post date:** [January 19, 2006, 6:39pm UTC](https://www.ruby-forum.com/t/search-with-like-operation-from-a-table/95523/4 "2006-01-19T18:39:40Z")

</div>

Hi Thila

I have written a search engine for rails apps that might help you. As  
others have noted, an index isn’t going to help you when using LIKE in a  
full text search. One approach that many search engines use is to  
parse,  
tokenize and stem data on its way into the database and store each term  
in a  
separate table. The TERMS table is then indexed to provide very quick  
lookups. This is the approach I have taken in my search engine.

Please feel free to take it for a spin:  
[http://lance.langwell-ball.com/pages/indexed-search](http://lance.langwell-ball.com/pages/indexed-search)

I’d be very happy to help you out if you have questions or run into  
problems.

There are, of course, other options as well such as Ferret (  
[http://ferret.davebalmain.com/trac](http://ferret.davebalmain.com/trac)). This may be more what you are  
looking  
for - it’s certainly more mature. I’ve written my search engine,  
however,  
to be very easy to incorporate and use in a rails app.

Please do let me know if you try it out and/or end up using it.

Lance
