如何编写查询以匹配语句中的整个子词?请参考下面的例子。
E.g。
ES中存在多条记录。
用户输入
"牛奶,喝茶",ElasticSearch的预期搜索结果是只记录-1("牛奶茶#34;)。也就是说,只有当所有子词都匹配时才能显示记录。
答案 0 :(得分:0)
最后,我找到了答案,并希望这可以帮助其他人。
使用“短语和口号”。下面是一个Java示例
QueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery("milk, drink tea", "function")
.slop(100).type(MatchQueryBuilder.Type.PHRASE);
答案 1 :(得分:-1)
我不确定这个解决方案是否适合您,但请: 它将返回包含所有提到的单词的所有记录,用空格分隔:
这里我们在创建新功能之前先进行清洁:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[elasticClasues]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[elasticClasues]
go
功能
对于@data和@tags函数中的每个单词都会创建子句:@data like'%tag%'
示例:
@data ='desc'
@tags ='大白便宜'
return:desc喜欢'%big%'和desc喜欢'%white%'和desc喜欢'%expensive%'
create function [dbo].[elasticClasues] (@what varchar(30), @tags nvarchar(1000) ) returns nvarchar(1000) as
begin
declare @i int, @out varchar(1000)
set @i = 0
set @out = ''
if @tags='' return '1=1'
while (LEN(@tags) > 0)
begin
select @i = COALESCE( PATINDEX('% %',@tags ), 0)
if @i = 0
begin
select @out = @out + ' ' + @what + ' like ''%' + @tags + '%'''
return @out
end
else
begin
select @out = @out + ' ' + @what + ' like ''%' + substring(@tags, 1, @i-1) + '%'' and '
select @tags = substring(@tags, @i+1, LEN(@tags))
end
end -- while
return @out
end
go
如何使用
CREATE TABLE #USER_TABLE(recordid int NOT NULL IDENTITY, data varchar(255) )
insert into #USER_TABLE (data) values ('milkway tea'),('tea in shop'),('shop way milk'),('big tea')
select * from #USER_TABLE
USER_TABLE:
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
让我们留意记录:
<强> A 强>
declare @command nvarchar(1000)
set @command = 'select * from #USER_TABLE where ' + dbo.elasticClasues('data','milk')
execute SP_EXECUTESQL @command;
recordid data
-------------------------
1 milkway tea
3 shop way milk
<强>乙强>
declare @command nvarchar(1000)
set @command = 'select * from #USER_TABLE where ' + dbo.elasticClasues('data','tea')
execute SP_EXECUTESQL @command;
recordid data
-------------------------
1 milkway tea
2 tea in shop
4 big tea
<强> C 强>
declare @command nvarchar(1000)
set @command = 'select * from #USER_TABLE where ' + dbo.elasticClasues('data','tea milk')
execute SP_EXECUTESQL @command;
recordid data
-------------------------
1 milkway tea