我最近尝试从MySQL全文搜索迁移到ElasticSearch,我对翻译一些查询有点困惑。
我有这个疑问。
"SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)"
这意味着"哈利"和"波特"都必须显示在描述栏中,无论顺序或位置如何。(为了举例起见,请假设"哈利"和"波特"可以相互独立。
我使用ElasticSearch尝试过这个
{
"query": {
"query_string": {
"query": "Harry Potter",
"fields": ["description"]
}
}
}
但它仍然给出了一些只包含"哈利"或"波特"的结果。
我也试过这个,
{
"query": {
"bool": {
"must" : {
"term" : { "description" : "Harry Potter" }
}
}
}
}
这个返回所有结果包含"哈利波特",而不是"哈利布拉波特"和"波特
布拉哈利"。什么是最简单(或者也可能是最快的)ElasticSearch查询,它返回与上述MySQL查询相同的结果。
更新
我刚刚发现了这样的东西
{
"query": {
"match" : {
"description" : {
"query" : "Harry Potter",
"operator" : "and"
}
}
}
}
结果似乎是正确的。但是还有其他更常见的方法吗?
Vis 答案的更多信息
如果你想让"哈利波特"也匹配"哈利blabla波特",你可以将query_string的phrase_slop调整为>0,这是匹配项之间的允许距离: - 默认为 0 表示需要完全匹配的短语,搜索阶段之间没有其他术语 - 设置为 1 表示允许 1 项之间,因此"哈利·布拉尔·波特"将匹配,但"哈利·布拉布拉·bloblo 波特"不会匹配。 - ...
默认运算符设置为 AND,就像您已经找到的那样,或者使用
+Harry +Potter
您在query_string查询中也用于 MySQL 的语法。
ElasticSearch 默认使用 OR,因此query_string查询"哈利波特"返回的结果仅包含一个单词。
术语查询仅在索引包含您在术语查询中输入的确切术语时匹配,并且由于字符串"哈利波特"与"哈利blabla波特"不匹配,因此您没有得到匹配项。
如果你想要另一种方式,你可以使用你拥有的布尔查询,并使其包含两个单独的 must 子句,一个用于"哈利",一个用于"波特",但在这种情况下可能不需要。