elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

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“奶茶饼干”不应该与查询“奶茶”相匹配。我说得对吗?