有人可以提出建议吗,如何将用户输入(几个单词)与系统中的相应标签相匹配(每个还有1个或N个单词)?
以下是演示问题的示例: 我有一个标签,分配给对象。例如(标签由COMA分隔,但在现实生活中我与表格有关)
Object Tags
Earth World, reality
World of warcraft 3 World Of warcraft, virtual reality
quake game, virtual
我想得到以下内容:
用户输入“世界”:结果为“地球”
用户输入'魔兽世界':结果是'魔兽世界3 '
这很简单,精确搜索。但是:
用户输入'游戏世界':结果应按两个标签搜索 - “地球”,“地震”
用户输入'虚拟现实':返回所有3 条记录
用户输入'虚拟现实':地球,地震
我使用t-sql进行搜索,启用全文搜索并用于在主文本中查找关键字。 C#是中间层。但我更喜欢在t-sql级别上获得解决方案。
更新1 首先我要做的是禁止标签中的空格,比如stackoverflow。任何其他想法都会被提升。
答案 0 :(得分:3)
您可能希望使用Velocity缓存引擎进行调查,因为它非常支持标记(GetObjectsByTag,GetObjectsByAllTags,GetObjectsByAnyTag)以及所有的努力工作已经为你完成了!您所要做的就是使用适当的标记将对象加载到缓存中。
答案 1 :(得分:1)
您需要使用拆分功能在搜索字符串中拆分标记,然后尝试在标记中匹配这些标记
FUNCTION [dbo].[SplitString]
(
@String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
)
RETURNS @RetTable TABLE(
String varchar(1000)
)
AS
BEGIN
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
RETURN
END
DECLARE @String VARCHAR(8000) ,
@Delimiter VARCHAR(10)
DECLARE @RetTable TABLE(
String varchar(1000)
)
SELECT @String = 'world of ',
@Delimiter = ' '
--split FUNCTION that returns a table of tags to match
DECLARE @i INT ,
@j INT
SELECT @i = 1
WHILE @i <= LEN(@String)
BEGIN
PRINT @i
SELECT @j = CHARINDEX(@Delimiter, @String, @i + 1)
IF @j = 0
BEGIN
SELECT @j = LEN(@String) + 1
END
INSERT @RetTable SELECT LTRIM(RTRIM(SUBSTRING(@String, @i, @j - @i)))
SELECT @i = @j + LEN(@Delimiter)
END
SELECT * FROM @RetTable
--split FUNCTION that returns a table of tags to match
DECLARE @Table TABLE(
Objects VARCHAR(MAX),
Tags VARCHAR(MAX)
)
INSERT INTO @Table (Objects,Tags) SELECT 'Earth', 'World,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'World of warcraft 3', 'World Of warcraft,virtual,reality'
INSERT INTO @Table (Objects,Tags) SELECT 'quake', 'game,virtual'
SELECT DISTINCT
t.*
FROM @Table t,
@RetTable r
WHERE Tags LIKE '%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%,%'
OR Tags LIKE '%,%' + String + '%'
类似的东西。
答案 2 :(得分:0)
将这种复杂的业务逻辑放入SQL代码中并不是一个好主意!把它放在中间层,如果你担心性能,可以使用一些缓存机制。