跳到内容GydF4y2Ba

搜索查询语法GydF4y2Ba¶GydF4y2Ba

我们支持复杂查询的简单语法,规则如下:GydF4y2Ba

  • 多字短语只是一个令牌列表,例如令牌列表。GydF4y2Bafoo酒吧巴兹GydF4y2Ba,并隐含与(and)项的交集。GydF4y2Ba
  • 确切的短语用引号括起来,例如GydF4y2Ba“hello world”GydF4y2Ba.GydF4y2Ba
  • 或工会(即GydF4y2BaWord1或Word2.GydF4y2Ba),用管道表示(GydF4y2Ba|GydF4y2Ba),例如,GydF4y2Ba你好|喂|您好|你好GydF4y2Ba.GydF4y2Ba
  • 不是否定(即。GydF4y2Ba不word1 word2GydF4y2Ba)的表达式或子查询。如。GydF4y2Ba你好,世界GydF4y2Ba.从0.19.3版,纯粹的否定查询(即GydF4y2Ba喷火GydF4y2Ba或GydF4y2Ba-@title (foo | bar):GydF4y2Ba支持)。GydF4y2Ba
  • 前缀匹配(以前缀开头的所有术语)用a表示GydF4y2Ba*GydF4y2Ba.出于性能原因,要求最小前缀长度(默认为2,但可配置)GydF4y2Ba
  • 一个特殊的“通配符查询”,返回索引-中的所有结果GydF4y2Ba*GydF4y2Ba(不能与其他任何东西相结合)。GydF4y2Ba
  • 使用语法选择特定字段GydF4y2Ba@field:你好世界GydF4y2Ba.GydF4y2Ba
  • 数字范围与语法的数字字段匹配GydF4y2Ba@field({分钟}{马克斯}):GydF4y2Ba.GydF4y2Ba
  • 使用语法的Geo Radius匹配Geo RADIUSGydF4y2Ba@field:[{lon} {lat} {radius} {m|km|mi|ft}]GydF4y2Ba
  • 带有语法的标记字段过滤器GydF4y2Ba@field:{tag | tag |…}GydF4y2Ba.请参阅[标记字段| /标签]的完整文档。GydF4y2Ba
  • 可选条款或条款:GydF4y2Bafoo ~酒吧GydF4y2Ba意味着栏是可选的,但其中栏中的文件将更高。GydF4y2Ba
  • 术语上的模糊匹配(自v1.2.0起):GydF4y2Ba%你好%GydF4y2Ba意味着Levenshtein距离的所有术语。GydF4y2Ba
  • 查询中的表达式可以在括号中包裹以消除歧义,例如歧义。GydF4y2Ba(你好|赫拉)(世界| werld)GydF4y2Ba.GydF4y2Ba
  • 查询属性可以应用于单个子句,例如。GydF4y2Ba(foo bar) => {$weight: 2.0;$污水:1;若美元:错误;}GydF4y2Ba
  • 以上的组合可以一起使用,例如GydF4y2Ba你好(世界| foo)“bar baz”bbbbGydF4y2Ba

纯消极的查询GydF4y2Ba¶GydF4y2Ba

从0.19.3版本开始,查询可能只包含一个否定表达式,例如。GydF4y2Ba-你好GydF4y2Ba或GydF4y2Ba——(@title: foo | bar)GydF4y2Ba.结果将是所有的文档GydF4y2Ba不是GydF4y2Ba包含查询条件的。GydF4y2Ba

警告GydF4y2Ba

任何复杂的表达式都可以用这种方法求反,但是,在这里要小心:如果一个求反表达式几乎没有结果,这相当于遍历索引中的所有文档并对其进行排序,这可能会很慢,并导致很高的CPU消耗。GydF4y2Ba

域修饰符GydF4y2Ba¶GydF4y2Ba

as 0.12版本,可以在查询中指定字段修饰符,而不仅仅是使用infields全局关键字。GydF4y2Ba

对于每个查询表达式或子表达式,都可以通过在表达式前面加上GydF4y2Ba@GydF4y2Ba符号,字段名称和一个GydF4y2Ba:GydF4y2Ba(结肠)的象征。GydF4y2Ba

如果字段修饰符位于多个单词之前,则认为它们是具有相同修饰符的短语。GydF4y2Ba

如果字段修饰符位于括号中的表达式之前,则它仅应用于括号中的表达式。GydF4y2Ba

可以将多种修改器组合以在多个字段上创建复杂的过滤。例如,如果我们有车型的索引,用车载类,原产地和发动机类型,我们可以使用混合或柴油发动机搜索韩国制造的SUV - 具有以下查询:GydF4y2Ba

英国《金融时报》GydF4y2Ba.GydF4y2Ba搜索GydF4y2Ba汽车GydF4y2Ba“@country:韩国@engine:(柴油|混合)@class: suv”GydF4y2Ba

多种修饰符可以应用于相同的术语或分组术语。例如。:GydF4y2Ba

英国《金融时报》GydF4y2Ba.GydF4y2Ba搜索GydF4y2BaidxGydF4y2Ba“@Title |身体:(你好世界)@URL |图片:MyDomain”GydF4y2Ba

这将搜索在身体或标题中具有“Hello World”的文档,以及其URL或图像字段中的“MyDomain”术语。GydF4y2Ba

查询中的数字过滤器GydF4y2Ba¶GydF4y2Ba

如果模式中的字段被定义为数字,则可以通过在查询中指定过滤规则来使用redis请求中的筛选器参数或过滤。语法是GydF4y2Ba@field({分钟}{马克斯}):GydF4y2Ba- 例如GydF4y2Ba@price:(100 200)GydF4y2Ba.GydF4y2Ba

关于数字谓词的一些注意事项GydF4y2Ba¶GydF4y2Ba

  1. 可以指定一个数字谓词作为整个查询,而使用FILTER参数则不可能做到这一点。GydF4y2Ba

  2. 可以在同一个查询中交叉或联合多个数字过滤器,无论是对相同的字段还是不同的字段。GydF4y2Ba

  3. -inf.GydF4y2Ba那GydF4y2Ba正GydF4y2Ba和GydF4y2Ba+正GydF4y2Ba是一个范围内可接受的数字。因此大于100表示为GydF4y2Ba[(100款]GydF4y2Ba.GydF4y2Ba

  4. 数字过滤器是包容的。排他性最小或最大表示为GydF4y2Ba(GydF4y2Ba前往数字,例如,GydF4y2Ba((100 (200)GydF4y2Ba.GydF4y2Ba

  5. 可以通过预先配置一个数字过滤器来否定数字滤波器GydF4y2Ba-GydF4y2Ba在过滤器上签名,例如返回一个价格与100不同的结果,表示为:GydF4y2Ba@title: foo -@price:(100 100)GydF4y2Ba.GydF4y2Ba

标记过滤器GydF4y2Ba¶GydF4y2Ba

RediSearch(从0.91版开始)允许一种称为“tag field”的特殊字段类型,在索引中使用更简单的标记和编码。这些字段中的值不能被常规无字段搜索访问,只能在特殊语法下使用:GydF4y2Ba

@fieldGydF4y2Ba:{GydF4y2Ba标签GydF4y2Ba|GydF4y2Ba标签GydF4y2Ba|GydF4y2Ba......GydF4y2Ba}GydF4y2BaE.GydF4y2Ba.GydF4y2BaGGydF4y2Ba.GydF4y2Ba@citiesGydF4y2Ba:{GydF4y2Ba新GydF4y2Ba纽约GydF4y2Ba|GydF4y2Ba洛杉矶GydF4y2Ba安吉利斯GydF4y2Ba|GydF4y2Ba巴塞罗那GydF4y2Ba}GydF4y2Ba

标签可以有多个单词或包括除字段分隔符以外的其他标点符号(GydF4y2Ba那GydF4y2Ba默认情况下)。标签中的标点符号应用反斜杠转义(GydF4y2Ba\GydF4y2Ba)。也建议逃避空间(但不是强制性);原因是,如果多字标记包含停止字,则它将创建语法错误。因此,“要成为或不成为”的标签应该被转义为“\ be \或\ not \ be \ be”。有关良好的衡量标准,您可以在标签中逃脱所有空格。GydF4y2Ba

请注意,同一子句中的多个标记创建了包含任一标记的文档的联合。创建包含GydF4y2Ba所有GydF4y2Ba标签,你应该重复标签过滤器几次,例如:GydF4y2Ba

#GydF4y2Ba这个GydF4y2Ba将GydF4y2Ba返回GydF4y2Ba所有GydF4y2Ba文件GydF4y2Ba包含GydF4y2Ba所有GydF4y2Ba三个GydF4y2Ba城市GydF4y2Ba作为GydF4y2Ba标签GydF4y2Ba:GydF4y2Ba@citiesGydF4y2Ba:{GydF4y2Ba新GydF4y2Ba纽约GydF4y2Ba}GydF4y2Ba@citiesGydF4y2Ba:{GydF4y2Ba洛杉矶GydF4y2Ba安吉利斯GydF4y2Ba}GydF4y2Ba@citiesGydF4y2Ba:{GydF4y2Ba巴塞罗那GydF4y2Ba}GydF4y2Ba#GydF4y2Ba这个GydF4y2Ba将GydF4y2Ba返回GydF4y2Ba所有GydF4y2Ba文件GydF4y2Ba包含GydF4y2Ba任何一个GydF4y2Ba城市GydF4y2Ba:GydF4y2Ba@citiesGydF4y2Ba:{GydF4y2Ba新GydF4y2Ba纽约GydF4y2Ba|GydF4y2Ba洛杉矶GydF4y2Ba安吉利斯GydF4y2Ba|GydF4y2Ba巴塞罗那GydF4y2Ba}GydF4y2Ba

标签子句可以组合成任何子句,用作否定表达式、可选表达式等。GydF4y2Ba

查询中的地理位置过滤器GydF4y2Ba¶GydF4y2Ba

从0.21版本中,可以使用语法将Geo RADIUS查询直接添加到查询语言中GydF4y2Ba@field:[{lon} {lat} {radius} {m|km|mi|ft}]GydF4y2Ba.这将结果从LON,LAT点,定义为以米,公里,数英尺或英尺定义的给定半径。见redis'自己GydF4y2Ba格雷迪乌斯GydF4y2Ba命令获取更多细节,因为它在内部使用)。GydF4y2Ba

可以像数字过滤器一样添加RADIUS过滤器。例如,在企业数据库中,寻找旧金山附近的中餐(5公里半径)将表示为:GydF4y2Ba中国餐厅@位置:[-122.41 37.77 5公里]GydF4y2Ba.GydF4y2Ba

前缀匹配GydF4y2Ba¶GydF4y2Ba

在索引更新时,我们维护一个包含索引中所有术语的字典。这可以用来匹配以给定前缀开头的所有术语。选择前缀匹配是通过附加来完成的GydF4y2Ba*GydF4y2Ba到前缀令牌。例如:GydF4y2Ba

冥界*世界GydF4y2Ba

将扩大覆盖范围GydF4y2Ba(你好|帮助|掌舵| ......)世界GydF4y2Ba.GydF4y2Ba

关于前缀搜索的一些注意事项GydF4y2Ba¶GydF4y2Ba

  1. 由于前缀可以扩展成许多许多术语,所以使用它们时要谨慎。没有魔术正在进行,扩展将创建一个联盟操作的所有后缀。GydF4y2Ba

  2. 作为一种保护措施,避免选择太多术语,并且块redis是单线程的,对前缀匹配有两个限制:GydF4y2Ba

  3. 前缀限制为2个字母或更多。您可以使用使用方法更改此号码GydF4y2BaMinprefix.GydF4y2Ba在模块命令行上设置。GydF4y2Ba

  4. 扩展限制为200条术语或更少。您可以使用使用方法更改此号码GydF4y2BaMAXEXPANSIONSGydF4y2Ba在模块命令行上设置。GydF4y2Ba

  5. 前缀匹配完全支持Unicode并且不区分大小写。GydF4y2Ba

  6. 目前,还没有基于后缀流行度的分类或偏见,但这是近期的路线图。GydF4y2Ba

模糊匹配GydF4y2Ba¶GydF4y2Ba

v1.2.0,索引中所有术语的字典也可用于执行GydF4y2Ba模糊匹配GydF4y2Ba.模糊匹配是基于GydF4y2BaLevenshtein距离GydF4y2Ba(LD)。术语的模糊匹配是通过用“%”包围术语来执行的,例如:GydF4y2Ba

%你好GydF4y2Ba%GydF4y2Ba世界GydF4y2Ba

对于LD为1的所有条款,将在“Hello”上执行模糊匹配。GydF4y2Ba

在v1.4.0中,模糊匹配的LD可以通过围绕它的'%'的数量来设置,以便GydF4y2Ba% % % %你好GydF4y2Ba将对LD为2的所有术语进行模糊匹配。GydF4y2Ba

模糊匹配的最大LD为3。GydF4y2Ba

通配符查询GydF4y2Ba¶GydF4y2Ba

从版本1.1.0的版本,我们提供了一个特殊的查询来检索索引中的所有文档。这主要用于聚合引擎。您可以通过仅将单星标志指定为查询字符串来调用它 - 即GydF4y2BaFT.SEARCH myIndex *GydF4y2Ba.GydF4y2Ba

这不能与查询中的任何其他过滤器,字段修饰符或任何内容组合。技术上可以在查询字符串外使用已弃用的过滤器和GeoFilter请求参数与通配符一起使用,但这使得通配符毫无意义,只能伤害性能。GydF4y2Ba

查询属性GydF4y2Ba¶GydF4y2Ba

从1.2.0版本开始,可以将特定的查询修改属性应用到查询的特定子句。GydF4y2Ba

语法是GydF4y2Ba(foo bar) =>{$属性:值;属性:美元价值;…}GydF4y2Ba,如:GydF4y2Ba

(GydF4y2Ba喷火GydF4y2Ba酒吧GydF4y2Ba)GydF4y2Ba=>GydF4y2Ba{GydF4y2Ba$GydF4y2Ba重量GydF4y2Ba:GydF4y2Ba2.0GydF4y2Ba;GydF4y2Ba$GydF4y2Ba污水GydF4y2Ba:GydF4y2Ba1GydF4y2Ba;GydF4y2Ba$GydF4y2Ba有条不紊地进行GydF4y2Ba:GydF4y2Ba真正的GydF4y2Ba;GydF4y2Ba}GydF4y2Ba~ (GydF4y2Ba酒吧GydF4y2BaBaz.GydF4y2Ba)GydF4y2Ba=>GydF4y2Ba{GydF4y2Ba$GydF4y2Ba重量GydF4y2Ba:GydF4y2Ba0.5GydF4y2Ba;GydF4y2Ba}GydF4y2Ba

支持的属性有:GydF4y2Ba

  • $重量GydF4y2Ba:确定子查询或令牌在结果总体排名中的权重(默认值:1.0)。GydF4y2Ba
  • $ slop.GydF4y2Ba:确定查询子句中允许的最大“slop”(术语之间的空格)(默认为0)。GydF4y2Ba
  • 美元有条不紊地进行GydF4y2Ba:Query子句中的术语是否必须与查询中的相同的顺序出现,通常与GydF4y2Ba$ slop.GydF4y2Ba(默认值:false)。GydF4y2Ba
  • 美元的语音GydF4y2Ba:是否执行语音匹配(默认为true)。注意:对于不是创建为的字段设置此属性GydF4y2Ba语音GydF4y2Ba将产生一个错误。GydF4y2Ba

一些查询示例GydF4y2Ba¶GydF4y2Ba

  • 简单的短语查询-你好和世界GydF4y2Ba

    你好,世界GydF4y2Ba
  • 精确短语查询-GydF4y2Ba你好GydF4y2Ba紧随其后的是GydF4y2Ba世界GydF4y2Ba

    “hello world”GydF4y2Ba
  • 联合:包含任何一种的文档GydF4y2Ba你好GydF4y2Ba或GydF4y2Ba世界GydF4y2Ba

    你好|世界GydF4y2Ba
  • 不是:文档包含GydF4y2Ba你好GydF4y2Ba但不是GydF4y2Ba世界GydF4y2Ba

    你好,世界GydF4y2Ba
  • 十字路口的工会GydF4y2Ba

    (你好|晕)(世界| werld)GydF4y2Ba
  • 否定的联盟GydF4y2Ba

    您好 - (世界| WERLD)GydF4y2Ba
  • 联盟内部短语GydF4y2Ba

    (巴拉克|营房)奥巴马GydF4y2Ba
  • 优先级高于包含更多匹配项的可选条款:GydF4y2Ba

    奥巴马〜巴拉克〜米歇尔GydF4y2Ba
  • 一个领域中的确切短语,另一个领域中的一个单词:GydF4y2Ba

    @titleGydF4y2Ba:GydF4y2Ba“巴拉克•奥巴马(barack obama)”GydF4y2Ba@jobGydF4y2Ba:GydF4y2Ba总统GydF4y2Ba
  • 与字段说明符组合的AND, OR:GydF4y2Ba

    @titleGydF4y2Ba:GydF4y2Ba你好GydF4y2Ba世界GydF4y2Ba@身体GydF4y2Ba:GydF4y2Ba(GydF4y2Ba喷火GydF4y2Ba酒吧GydF4y2Ba)GydF4y2Ba@categoryGydF4y2Ba:GydF4y2Ba(GydF4y2Ba文章GydF4y2Ba|GydF4y2Ba传记GydF4y2Ba)GydF4y2Ba
  • 前缀查询:GydF4y2Ba

    Hello world * hel* world * Hello - world *GydF4y2Ba
  • 数字滤波 - 产品名为“TV”,价格范围为200-500:GydF4y2Ba

    @ nameGydF4y2Ba:GydF4y2Ba电视GydF4y2Ba@价钱GydF4y2Ba:GydF4y2Ba[GydF4y2Ba200 500.GydF4y2Ba]GydF4y2Ba
  • 数字过滤-年龄大于18岁的用户:GydF4y2Ba

    @年龄GydF4y2Ba:GydF4y2Ba[GydF4y2Ba(18 +正GydF4y2Ba]GydF4y2Ba

映射常见的SQL谓词来重新搜索GydF4y2Ba¶GydF4y2Ba

SQL状态GydF4y2Ba RediSearch等效GydF4y2Ba 评论GydF4y2Ba
其中x ='foo'和y ='bar'GydF4y2Ba @x:foo @y:酒吧GydF4y2Ba 为了减少歧义,使用(@x:foo) (@y:bar)GydF4y2Ba
x='foo' AND y!= '酒吧'GydF4y2Ba @x:foo - @ y:barGydF4y2Ba
x='foo' OR y='bar'GydF4y2Ba (@x: foo) | (@y: bar)GydF4y2Ba
其中x在('foo','bar','hello world')GydF4y2Ba @x:(foo | bar |“hello world”)GydF4y2Ba 引用意味着准确的短语GydF4y2Ba
其中y ='foo'和x不是('foo','bar')GydF4y2Ba @y:foo( - @ x:foo)( - @ x:bar)GydF4y2Ba
其中x不在('foo','bar')GydF4y2Ba - @ x :( foo |酒吧)GydF4y2Ba
num在10和20之间GydF4y2Ba @num: 20 [10]GydF4y2Ba
其中num> = 10GydF4y2Ba @num:[10 + INF]GydF4y2Ba
num > 10在哪里GydF4y2Ba @num((10 +正):GydF4y2Ba
其中num < 10GydF4y2Ba @num(负无穷(10):GydF4y2Ba
WHERE num <= 10GydF4y2Ba @Num:[ - INF 10]GydF4y2Ba
其中num <10或num> 20GydF4y2Ba @num:[-inf (10)] |GydF4y2Ba
name LIKE 'john%'GydF4y2Ba @Name:John *GydF4y2Ba

技术说明GydF4y2Ba¶GydF4y2Ba

查询解析器是使用Lemon Parser生成器和基于Ragel的Lexer构建的。你可以看到语法定义GydF4y2Ba在git回购处GydF4y2Ba.GydF4y2Ba

Baidu