我有一个类似于http://drive.google.com的链接,并且我想在该链接之外匹配“
google”。
我有:
query: {
bool : {
must: {
match: { text: 'google'}
}
}
}
但这仅在整个文本为“ google”时才匹配(不区分大小写,因此也匹配Google或GooGlE等)。如何匹配另一个字符串中的“ google”?
关键是您使用的ElasticSearch正则表达式需要
完整的字符串匹配
:
Lucene的模式总是锚定的 。提供的模式 必须与整个字符串匹配 。
因此,要匹配任何字符(除了换行符),可以使用.*
pattern:
match: { text: '.*google.*'}
^^ ^^
另外一种变体是针对您的字符串可以包含换行符的情况:match: { text: '(.|\n)*google(.|\n)*'}
。这可怕的(.|\n)*
是ElasticSearch必须的,因为这正则表达式的味道不允许任何[\s\S]
解决方法,也没有任何DOTALL
/单行标志。 “
Lucene正则表达式引擎不兼容Perl,但支持较小范围的运算符。”
但是 ,如果您不打算匹配任何复杂的模式并且不需要单词边界检查,那么仅使用 通配符搜索 就可以更好地执行仅对子字符串进行正则表达式
搜索 :
{
"query": {
"wildcard": {
"text": {
"value": "*google*",
"boost": 1.0,
"rewrite": "constant_score"
}
}
}
}
有关更多详细信息,请参见
通配符搜索 。
注意 :通配符模式还需要匹配整个输入字符串,因此
google*
查找所有以 开头的 字符串 __google
*google*
查找 包含的 所有字符串 __google
*google
查找所有 以结尾的 字符串 __google
另外,请记住通配符模式中仅有的一对特殊字符:
?, which matches any single character
*, which can match zero or more characters, including an empty one
问题内容: 我在ElasticSearch字段中有一个我不想分析的字段,即应逐字存储和比较它。这些值将包含字母,数字,空格,破折号,斜杠以及其他字符。 如果我在此字段的映射中未提供分析器,则默认值仍会使用标记程序,该标记程序会将我的逐字字符串分成大量单词。我不要 是否有一个超级简单的分析器,基本上不分析?还是有另一种方式表示不应分析此字段? 我只创建索引,我什么也没做。我可以在其他字段中使用“英语
问题内容: 我正在使用Elasticsearch构建URL索引。 我将一个URL提取为3个部分,分别是“域”,“路径”和“查询”。 例如:将分为 当我想在索引中部分搜索域时出现问题,例如“ user = who”或“ ing.com”。 甚至在索引时没有使用“ Analyzer”时,是否可以使用“ Analyzer”? 如何基于分析仪进行部分搜索? 非常感谢你。 问题答案: 2种方法: 1.通配符
问题内容: 在索引中,我有一个IP字段。字段的类型为“ ip”。 我想搜索所有以“ 192.168”开头的IP 我所有的尝试都失败了,并显示以下消息: 无法解析IP [192.168],不是有效的IP地址 有没有办法做到这一点,还是应该将字段的类型更改为“字符串”? 谢谢。 问题答案: 您可以使用范围查询,例如:
问题内容: 假设在我的Elasticsearch索引中,我有一个名为“点”的字段,其中将包含由标点符号分隔的字符串(例如“ first.second.third”)。 我需要搜索例如“ first.second”,然后获取其“点”字段包含正好是“ first.second”或以“ first.second”开头的字符串的所有条目。 我在理解文本查询的工作方式时遇到问题,至少我无法创建执行此任务的查
问题内容: 我正在尝试为最终用户提供搜索类型,这更像sqlserver。我能够为给定的SQL场景实现ES查询: 但是ES查询不适用于此sql查询 在我的elasticsearch以及通配符查询中,我还需要执行一些布尔过滤查询 上面的带有通配符搜索的弹性查询可以很好地工作,并让我获得所有与pete匹配且不是xyz和abc类型的文档。但是当我尝试使用以空格分隔的2个独立单词执行通配符时,相同的查询返回
问题内容: 所以我有一个字段以以下格式存储值:,例如23 / 2014、24 / 2014、12 / 2015等。 因此,如果将此字段映射为一个,则可以使用术语过滤器进行精确值搜索,如果我在该精确结构中搜索值(类似于1 / 2014、15 / 2014等),则可以正常工作,例如。 因此,使用11 /或/ 2014之类的其他内容进行搜索不会返回匹配。这可以。 但是,如果将字段定义为,则无法使用查询进