Full text search vs LIKE

前端 未结 6 1803
长情又很酷
长情又很酷 2021-02-04 01:45

My question is about using fulltext.As I know like queries which begin with % never use index :

SELECT * from customer where name like %username%
6条回答
  •  自闭症患者
    2021-02-04 02:04

    Short answer

    There is no efficient way to perform infix searches in SQL Server, neither using LIKE on an indexed column, or with a fulltext index.

    Long answer

    In the general case, there is no fulltext equivalent to the LIKE operator. While LIKE works on a string of characters and can perform arbitrary wildcard matches against anything inside the target, by design fulltext operates upon whole words/terms only. (This is a slight simplification but it will do for the purpose of this answer.)

    SQL Server fulltext does support a subset of LIKE with the prefix term operator. From the docs (http://msdn.microsoft.com/en-us/library/ms187787.aspx):

    SELECT Name
    FROM Production.Product
    WHERE CONTAINS(Name, ' "Chain*" ');
    

    would return products named chainsaw, chainmail, etc. Functionally, this doesn't gain you anything over the standard LIKE operator (LIKE 'Chain%'), and as long as the column is indexed, using LIKE for a prefixed search should give acceptable performance.

    The LIKE operator allows you to put the wildcard anywhere, for instance LIKE '%chain', and as you mentioned this prevents an index from being used. But with fulltext, the asterisk can only appear at the end of a query term, so this is of no help to you.

    Using LIKE, it is possible to perform efficient postfix searches by creating a new column, setting its value to the reverse your target column, and indexing it. You can then query as follows:

    SELECT Name
    FROM Production.Product
    WHERE Name_Reversed LIKE 'niahc%'; /* "chain" backwards */
    

    which returns products with their names ending with "chain".

    I suppose you could then combine the prefix and reversed postfix hack:

    SELECT Name
    FROM Production.Product
    WHERE Name LIKE 'chain%'
    AND Name_Reversed LIKE 'niahc%';
    

    which implements a (potentially) indexed infix search, but it's not particularly pretty (and I've never tested this to see if the query optimizer would even use both indexes in its plan).

提交回复
热议问题