MySQL全文搜索“;及;ElasticSearch的布尔模式
我最近尝试从MySQL全文搜索迁移到ElasticSearch,但我对翻译一些查询有点困惑 我有这个疑问MySQL全文搜索“;及;ElasticSearch的布尔模式,mysql,
elasticsearch,Mysql,
elasticsearch,我最近尝试从MySQL全文搜索迁移到ElasticSearch,但我对翻译一些查询有点困惑 我有这个疑问 "SELECT * FROM Books WHERE MATCH (description) AGAINST ('+Harry +Potter' IN BOOLEAN MODE)" 这意味着无论顺序或位置如何,“哈利”和“波特”都必须显示在描述栏中。(为了举例,请假设“哈利”和“波特”可以相互独立。) 我用ElasticSearch试过了 { "query": {
"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" }
}
}
}
}
这一个返回所有包含“哈利·波特”的结果,而不是“哈利·布拉·布拉·波特”和“哈利·布拉·布拉·哈利”
返回与上述MySQL查询相同结果的最简单(或者可能也是最快)的ElasticSearch查询是什么
更新
我刚刚发现了这样的东西
{
"query": {
"match" : {
"description" : {
"query" : "Harry Potter",
"operator" : "and"
}
}
}
}
结果似乎差不多。但是还有其他更常见的方法吗?您需要将默认运算符设置为和您已经找到的一样,或者使用
+Harry +Potter
您在查询字符串查询中还使用了MySQL的语法
ElasticSearch默认使用或,这就是为什么对“哈利波特”的查询字符串查询返回的结果只包含其中一个单词
仅当索引包含您在术语查询中输入的确切术语时,术语查询才匹配,并且由于字符串“Harry Potter”与“Harry blabla Potter”不匹配,因此您没有获得匹配项
如果您想要另一种方式,您可以使用已有的布尔查询,并使其包含两个单独的must子句,一个用于“Harry”,另一个用于“Potter”,但在本例中可能不需要这样做。您需要将默认运算符设置为和您已经找到的一样,或者使用
+Harry +Potter
您在查询字符串查询中还使用了MySQL的语法
ElasticSearch默认使用或,这就是为什么对“哈利波特”的查询字符串查询返回的结果只包含其中一个单词
仅当索引包含您在术语查询中输入的确切术语时,术语查询才匹配,并且由于字符串“Harry Potter”与“Harry blabla Potter”不匹配,因此您没有获得匹配项
如果你想用另一种方法,你可以使用你的布尔查询,让它包含两个独立的必选子句,一个表示“Harry”,一个表示“Potter”,但在本例中可能不需要这样做。有关Vis答案的更多信息 如果您希望“哈利波特”也匹配“哈利·布拉布拉·波特”,您可以将查询字符串的短语斜率调整为somethings>0,这是匹配项之间允许的距离: -默认值为0表示需要精确的短语匹配,搜索阶段之间不需要其他术语 -设置为1意味着允许它之间有一个术语,所以“哈利·布拉拉尔·波特”将匹配,但“哈利·布拉布拉·布洛·波特”将不匹配。
-…有关Vis答案的更多信息 如果您希望“哈利波特”也匹配“哈利·布拉布拉·波特”,您可以将查询字符串的短语斜率调整为somethings>0,这是匹配项之间允许的距离: -默认值为0表示需要精确的短语匹配,搜索阶段之间不需要其他术语 -设置为1意味着允许它之间有一个术语,所以“哈利·布拉拉尔·波特”将匹配,但“哈利·布拉布拉·布洛·波特”将不匹配。 -