Java ElasticSearch-查询时如何匹配所有子词
如何编写查询以匹配语句中的整个子词?请参考下面的例子 例如Java ElasticSearch-查询时如何匹配所有子词,java,
elasticsearch,Java,
elasticsearch,如何编写查询以匹配语句中的整个子词?请参考下面的例子 例如 ES中存在多个记录 记录1“奶茶” 记录2“茶几” 记录-3“牛奶时间” 用户输入 输入“牛奶”,记录1和记录3显示 进入“团队”,记录1和记录2显示 进入“牛奶,喝茶”,只有记录1显示 “牛奶,喝茶”,ElasticSearch的预期搜索结果是只有Record-1(“牛奶,喝茶”)。也就是说,只有当所有子单词都匹配时,才应显示记录。我不确定此解决方案是否适合您,但请: 它将返回包含所有提到的单词的所有记录,并用空格分隔: 在创
ES中存在多个记录
- 记录1“奶茶”
- 记录2“茶几”
- 记录-3“牛奶时间”
- 输入“牛奶”,记录1和记录3显示
- 进入“团队”,记录1和记录2显示
- 进入“牛奶,喝茶”,只有记录1显示
“牛奶,喝茶”,ElasticSearch的预期搜索结果是只有Record-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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
功能
对于@data,@tags函数中的每个单词都将创建子句:@data,如“%tag%”
例如:
@数据='desc'
@标签=‘大白贵’
return:desc-like“%big%”和desc-like“%white%”以及desc-like“%priced%”
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
以及如何使用它:
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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
用户表:
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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
让我们来看看记录:
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
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
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
B
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
我不确定此解决方案是否适合您,但请: 它将返回包含所有提到的单词的所有记录,并用空格分隔: 在创建新功能之前,我们先从清洁开始:
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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
功能
对于@data,@tags函数中的每个单词都将创建子句:@data,如“%tag%”
例如:
@数据='desc'
@标签=‘大白贵’
return:desc-like“%big%”和desc-like“%white%”以及desc-like“%priced%”
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
以及如何使用它:
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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
用户表:
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
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
recordid data
-------------------------
1 milkway tea
2 tea in shop
3 shop way milk
4 big tea
让我们来看看记录:
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
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
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
B
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
最后,我找到了答案,希望这能帮助其他人 使用“短语和slop”。下面是一个Java示例
QueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery("milk, drink tea", "function")
.slop(100).type(MatchQueryBuilder.Type.PHRASE);
最后,我找到了答案,希望这能帮助其他人 使用“短语和slop”。下面是一个Java示例
QueryBuilder queryBuilder =
QueryBuilders.multiMatchQuery("milk, drink tea", "function")
.slop(100).type(MatchQueryBuilder.Type.PHRASE);
饮料
不在记录1中。你能确保你的例子正确地反映了你的期望吗?嗨@Val,牛奶/饮料/茶是ES分析(word)后的关键词,我期望的(用户需求)是用户想要得到产品描述中同时包含“牛奶”和“茶”的产品。也许,我对ES的理解是错误的?那么您的意思是只有当文档中的所有子词(即milk
+tea
)都与任何查询词匹配时?@Val,是的。可能吗?也许,这更清楚。如果用户输入牛奶,则显示记录1和3。如果用户输入tea,则记录1并显示2。如果用户输入牛奶和茶(牛奶、饮茶),则只需记录1个显示。@LeyAng最后一个示例很容易解决,在匹配查询中添加“运算符”:“和”
。我相信你真正想要的是:记录4“奶茶饼干”不应该与查询“奶茶”相匹配。我说的对吗?饮料
不在记录1中。你能确保你的例子正确地反映了你的期望吗?嗨@Val,牛奶/饮料/茶是ES分析(word)后的关键词,我期望的(用户需求)是用户想要得到产品描述中同时包含“牛奶”和“茶”的产品。也许,我对ES的理解是错误的?那么您的意思是只有当文档中的所有子词(即milk
+tea
)都与任何查询词匹配时?@Val,是的。可能吗?也许,这更清楚。如果用户输入牛奶,则显示记录1和3。如果用户输入tea,则记录1并显示2。如果用户输入牛奶和茶(牛奶、饮茶),则只需记录1个显示。@LeyAng最后一个示例很容易解决,在匹配查询中添加“运算符”:“和”
。我相信你真正想要的是:记录4“奶茶饼干”不应该与查询“奶茶”相匹配。我说得对吗?