ElasticSearch - 查询时如何匹配所有子词

时间:2016-02-23 07:16:05

标签: java elasticsearch

如何编写查询以匹配语句中的整个子词?请参考下面的例子。

E.g。
ES中存在多条记录。

  • 记录-1"加奶茶"
  • 记录-2"茶几"
  • 记录-3"牛奶时间"

用户输入

  • 输入" milk",Record-1和Record-3 show。
  • 输入" team",Record-1和Record-2 show。
  • 输入"牛奶,喝茶",仅记录-1显示。

"牛奶,喝茶",ElasticSearch的预期搜索结果是只记录-1("牛奶茶#34;)。也就是说,只有当所有子词都匹配时才能显示记录。

2 个答案:

答案 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