search criteria difference between Like vs Contains() in oracle

后端 未结 2 704
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-10 06:50

I created a table with two columns.I inserted two rows.

id     name
1      narsi reddy
2      narei sia

one is simply number type and anoth

相关标签:
2条回答
  • 2020-12-10 07:04

    LIKE and CONTAINS are fundamentally different methods for searching.

    LIKE is a very simple string pattern matcher - it recognises two wildcards (%) and (_) which match zero-or-more, or exactly-one, character respectively. In your case, %a%e% matches two records in your table - it looks for zero or more characters followed by a, followed by zero or more characters followed by e, followed by zero or more characters. It is also very simplistic in its return value: it either returns "matched" or "not matched" - no shades of grey.

    CONTAINS is a powerful search tool that uses a context index, which builds a kind of word tree which can be searched using the CONTAINS search syntax. It can be used to search for a single word, a combination of words, and has a rich syntax of its own, such as boolean operators (AND, NEAR, ACCUM). It is also more powerful in that instead of returning a simple "matched" or "not matched", it returns a "score", which can be used to rank results in order of relevance; e.g. CONTAINS(col, 'dog NEAR cat') will return a higher score for a document where those two words are both found close together.

    0 讨论(0)
  • 2020-12-10 07:22

    I believe that your CONTAINS query is matching 'narei sia' because the pattern '%a%e%' matches the word 'narei'. It does not match against 'narsi reddy' because neither word, taken individually, matches the pattern.

    I assume you want to use CONTAINS instead of LIKE for performance reasons. I am not by any means an expert on CONTAINS query expressions, but I don't see a simple way to do the exact search you want, since you are looking for letters that can be in the same word or different words, but must occur in a given order. I think it may be best to do a combination of the two techniques:

    WHERE CONTAINS(name,'%a% AND %e%') > 0
      AND name LIKE '%a%e%'
    

    I think this would allow the text index to be used to find candidate matches (anything which has at least one word containing 'a' and at least one word containing 'e'). These would would then be filtered by the LIKE condition, enforcing the requirement that 'a' precede 'e' in the string.

    0 讨论(0)
提交回复
热议问题