弹性搜索查询字符串查询

4

我正在尝试使用查询字符串查询(Query String Query)获取记录。
我的搜索场景如下:
我需要进行以下搜索:"I Love my " AND (HTC OR Iphone OR Samsung)
我期望的结果如下:

  • I Love my HTC
  • I Love my Iphone
  • I Love my Samsung

我已经尝试了一些组合,但不起作用。

{
  "query": {
            "query_string": {
                "default_field": "SearchContent",
               "query": "\"I Love my\" AND (HTC OR Iphone OR Samsung)"
            }
        }
}

我该如何使用查询字符串来实现这个功能,或者还有其他的选项吗?我卡住了,请帮帮我。

你的查询看起来正确。mgm的答案(小写)可能就是它。因此,请检查您的分析器。 - Simon Steinberger
4个回答

9

查询取决于您的_mapping。如果您没有定义任何内容,则可能使用标准分析器。如果是这样,那么标记如下:

  • I Love my HTC -> "i", "love", "my", "htc"
  • I Love my Iphone -> "i", "love", "my", "iphone"
  • I Love my Samsung -> "i", "love", "my", "samsung"

请注意,标记都是小写。

您的查询字符串的正确格式为:

GET /yourindex/_search
{
  "query": {
    "query_string": {
      "default_field": "SearchContent",
      "query": "\"i love my\" AND (samsung OR htc OR iphone)"
    }
  }
}

0

是的,你可以基于match_all查询构建一个过滤查询,并结合and或or过滤器来筛选感兴趣的内容。在这里,你想返回包含这三个短语中任意一个的文档。我假设你不希望“我喜欢我的蛋糕,我有一部iPhone”也被返回。

因此,可以尝试以下方式(虽然不知道是否足够高效)。

{
"filtered" : {
    "query" : {
        "match_all" : {}
    },
    "filter" : {
        "or" : {
            "filters" : [{
                    "fquery" : {
                        "query" : {
                            "query_string" : {
                                "query" : "\"I love my iphone\"",
                                "default_field" : "searchContent",
                                "default_operator" : "and"
                            }
                        }
                    }
                },{
                    "fquery" : {
                        "query" : {
                            "query_string" : {
                                "query" : "\"I love my htc\"",
                                "default_field" : "searchContent",
                                "default_operator" : "and"
                            }
                        }
                    }
                },
                {
                    "fquery" : {
                        "query" : {
                            "query_string" : {
                                "query" : "\"I love my samsung\"",
                                "default_field" : "searchContent",
                                "default_operator" : "and"
                            }
                        }
                    }
                }
            ]
        }
    }
}

}


谢谢回复。但是我没有固定的值,就像我之前提到的那样。查询可能是任何东西,比如:"\"我有自己的\"" AND (笔记本电脑 OR 自行车 OR 露天摩托车)"通过阅读各种帖子,他们建议使用“查询字符串查询”将其转换为我们传递的布尔逻辑,但是在这里我没有得到那个输出。谢谢,Aniruddha - AniPol

0

试试这个...

{
  "query": {
            "query_string": {
                "default_field": "SearchContent",
               "query": "I Love my *"

            }
        }
}

如果数据量太大,通配符无法很好地扩展。但是,如果性能不是主要问题(数据量较少),这可能会有所帮助。


1
那并没有真正回答问题,是吗? - Simon Steinberger

-2

1
默认情况下,所有术语都是OR连接的。因此,此搜索不一定包含“我爱我的”。 - Simon Steinberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接