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