我正在为sql server全文搜索功能的表达式语法而苦苦挣扎。
我在表的一列中有一个用户“单词”列表:
SELECT DocumentNode, DocumentSummary
FROM Production.Document
WHERE CONTAINS(DocumentSummary, '"word1" OR "word2"')
对于x数单词列表,有没有有效的方法? 比以下更好的东西:
'"word1" OR "word2" ... OR "wordx"'
更新: 让我澄清一下,我的表(对于此处的示例-Production.Document)具有数百万条记录,因此我需要查询以实现最佳性能。此外,查询每天可能执行数千次。我写这个是为了解释为什么LIKE查询不是一个选项。
PS:如果我想念其他方法(除了全文搜索),请告诉。
答案 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。希望会有所帮助:)