Recently, we have an issue, FULL TEXT search was not working with CONTIANSTABLE. My friend was searching for a word in a document where the table is enabled with FULL TEXT feature, however the search was not bringing any records.
My first thought was there could be a missing join condition that could not get the results. The actual query in the issue was really a big one with lots of tables and filters involved.So the first thing that we did remove all joins or conditions and see if CONTAINSTABLE works good, but that attempt was also failing. It was a clear indication that there is something wrong that it could not return results at FULL TEXT functionality.
For everyone to understand better, Let us go through a sample script to replicate the issue:
1. Create a table for our example
CREATE TABLE [DBO].[DOCUMENTTABLE]( [DOCUMENTID] [UNIQUEIDENTIFIER] NOT NULL, [DOCUMENT_CONTENT] [IMAGE] NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] CREATE INDEX IX_DOCUMENTTABLE ON DOCUMETTABLE(DOCUMENTID)
2. Load some data into Table – We uploaded the same file in question which is a .xlsx type
3. Query table with CONTAINSTABLE
Select * From CONTAINSTABLE (DocumentTable, DOCUMENT_CONTENT,'reporting')
Msg 7601, Level 16, State 2, Line 2
Cannot use a CONTAINS or FREETEXT predicate on table or indexed view ‘DocumentTable’ because it is not full-text indexed.
4. Enable FULL TEXT Indexing on the table
5. While executing the query, it is observed again no data returned
Further, we decided to check the document and its content for the search word manually and found the word was present and the document was also the same “.xlsx”. It is to be noted that we saved the data in an IMAGE datatype as shown in the example. With that information, we wanted to know the supporting file types in our full text enabled table with the below query.
select document_type, path from sys.fulltext_document_types
The above query was not returning the document type – “.xlsx” and it clearly indicated that the reason why the document could not search the word as the document type was a non-supporting one. [DOCUMENTTABLE] is a table that enabled FULL TEXT and the datatype of the field “[DOCUMENT_CONTENT]” was IMAGE. Then, my analysis took me a very important information that if we need to index a document type for which a pre-installed iFilter does not exists at OS level, we need to install the appropriate iFilter in the OS and then load those into SQL Server for a successful search functionality.
How to install the iFilter and Load into SQL Server
1. Download the iFilter , the below supports a wide range of document types
Microsoft Office 2010 Filter Packs
(Please note that MSmight retire the above as latest version is released, you may need to check for the latest.)
The following file types are supported by the Office 2010 Filter Pack:
2. Install the downloaded set
3. Load the installed OS resources to SQL Server as below.
exec sp_fulltext_service 'load_os_resources', 1; exec sp_fulltext_service 'verify_signature', 0; exec sp_fulltext_service 'Update_languages' exec sp_fulltext_service 'Restart_all_fdhosts'
Once the above steps are completed, we were able to query the word and the results were returned as expected.
Hope this helps you in a similar situation and it was a good lesson learned to me!
How to register iFilters