Elasticsearch中的全字搜索

时间:2015-12-14 10:13:54

标签: regex elasticsearch

我需要在Elastic中实现全字搜索,它应该像这些例子一样工作:

查询:"测试"

必须与这些字符串匹配:

this is the test

the test is necessary

I didn't write the test because I was sick.

the test\non the newline

the test

但不是这些:

this is the testing server

this test is very good

I wrote my test with the cheatsheet

我曾尝试使用regexp filter,但有几个问题,因为Elasticsearch regexp语法不兼容Perl,因此我无法轻易识别单词的边界。这可以通过字符类来解决,但还有另一个问题,因为语法显然不支持\n表达式,因此我甚至无法识别换行符。字符串的开头/结尾也有问题,因为正则表达式必须匹配整个字符串..

如何使用Elasticsearch完成此操作?

提前致谢!

1 个答案:

答案 0 :(得分:0)

Dencker的答案的扩展(短语查询似乎确实是你想要的,而regexp可能是一个糟糕的选择,到目前为止提供信息):

我创建了two quick bash scripts,它将使用您的示例创建示例文档,并进行两次简单的短语搜索。

基本上,对于早期未指定映射的标准脚本,文本字段将获得不包含词干分析器的standard分析器。该脚本演示了对“测试”的match_phrase查询仅返回两个预期文档,而不是具有“测试”短语的文档。

但是在你的情况下可能会发生的事情就像bittusarkar所说的那样,你可能有一个映射,它指定了一个像snowball这样的分析器,它涉及一个阻止“测试”到“测试”的词干分析器。表示“测试”match_phrase查询还将返回“测试”文档,如雪球脚本所示。

总结一下脚本(用任何潜在的分析器替换雪球和阻塞器并停止):

“这是测试”:

standard:“test”(在我的版本标准分析器中有一个停用词过滤器)

snowball:“测试”

“测试\非换行”:

standard:“test”,“non”,“newline”

snowball:“test”,“non”,“newlin”

“这是测试服务器”:

standard:“测试”,“服务器”

snowball:“test”,“server”

“测试”(您的查询):“测试”(对于两个分析器)

考虑分析器以及内容如何获取索引可以解释为什么短语查询不适合您,并将帮助您弄清楚如何获得您期望的结果。您可能还需要考虑使用多字段类型来存储以多种方式分析的内容,具体取决于您要查询的内容。