SQL Server全文搜索单词列表

时间:2019-02-18 11:46:57

标签: sql-server full-text-search

我正在为sql server全文搜索功能的表达式语法而苦苦挣扎。

我在表的一列中有一个用户“单词”列表:

SELECT DocumentNode, DocumentSummary  
FROM Production.Document  
WHERE CONTAINS(DocumentSummary, '"word1" OR "word2"') 

对于x数单词列表,有没有有效的方法? 比以下更好的东西:

'"word1" OR "word2" ... OR "wordx"'

更新: 让我澄清一下,我的表(对于此处的示例-Production.Document)具有数百万条记录,因此我需要查询以实现最佳性能。此外,查询每天可能执行数千次。我写这个是为了解释为什么LIKE查询不是一个选项。

PS:如果我想念其他方法(除了全文搜索),请告诉。

2 个答案:

答案 0 :(得分:1)

无法使用CONTAINS进行操作,因为CONTAINS仅将列作为第一个参数,而将第二个作为参数。但是,您可以将单词放在表中,然后使用动态sql执行查询:

import sys
import inspect
import logging

from logging import Logger


class CallStackFormatter(logging.Formatter):

    def formatStack(self, _ = None) -> str:
        stack = inspect.stack()[::-1]
        stack_names = (inspect.getmodulename(stack[0].filename),
                       *(frame.function
                         for frame
                         in stack[1:-9]))
        return '::'.join(stack_names)

    def format(self, record):
        record.message = record.getMessage()
        record.stack_info = self.formatStack()
        if self.usesTime():
            record.asctime = self.formatTime(record, self.datefmt)
        s = self.formatMessage(record)
        if record.exc_info:
            # Cache the traceback text to avoid converting it multiple times
            # (it's constant anyway)
            if not record.exc_text:
                record.exc_text = self.formatException(record.exc_info)
        if record.exc_text:
            if s[-1:] != "\n":
                s = s + "\n"
            s = s + record.exc_text
        return s


def get_logger(name: str, fmt: str = '[ %(asctime)s ] [ %(levelname)-5s ] [ %(stack_info)s ] %(message)s') -> Logger:

        logger = logging.getLogger(name)
        logger.setLevel(logging.INFO)

        handler = logging.StreamHandler(sys.stdout)
        handler.setLevel(logging.INFO)

        formatter = CallStackFormatter(fmt)

        handler.setFormatter(formatter)

        logger.addHandler(handler)

        return logger

答案 1 :(得分:0)

如果您需要在列表中找到 all 的所有单词,请使用“ LIKE”运算符,如下所示:

SELECT Document.Node, Document.Summary
FROM Production.Document
WHERE Document.Summary LIKE '%word1%'
  AND Document.Summary LIKE '%word2%'

另一方面,如果您需要在列表中查找任何单词,只需将逻辑运算更改为OR。希望会有所帮助:)