在弹性搜索中,此过滤器
{
"bool": {
"must": {
"term": {
"article.title": "google"
}
}
}
}
正确退回标题中带有“google”的文章。
然而,
{
"bool": {
"must": {
"term": {
"article.title": "google earth"
}
}
}
}
不会返回任何结果,尽管标题中的文章中包含“google earth”字样。我希望它能这样做。
完整查询:
{
"size": 200,
"filter": {
"bool": {
"must": {
"term": {
"article.title": "google maps"
}
}
}
},
{
"range": {
"created_date": {
"from": "2013-01-11T02:14:03.352Z"
}
}
}]
}
}
如您所见,我没有“查询” - 只是过滤器,大小和范围。所以我认为ElasticSearch正在使用默认的分析器......?
我误解了什么?
编辑:对于那些寻找解决方案的人来说,这是我的过滤器:
{
"query": {
"bool": {
"must": {
"must_match": {
"article.title": "google earth"
}
}
}
}
}
节点(1)我们用“查询”包装bool过滤器和(2)“term”变为“must_match”,这导致整个短语匹配(而不是“匹配”,这将搜索在Google地球上使用标准分析器的article.title。
完整查询如下所示:
{
"size": 200,
"filter": {
"query": {
"bool": {
"must": {
"must_match": {
"article.title": "google earth"
}
}
}
}
}
}
FWIW,我在“过滤器”字段中具有此条件的原因(与使用标准查询相反)是有时我想使用“must_not”而不是“must_not”,有时我还添加其他查询的元素。
答案 0 :(得分:10)
Elasticsearch根本没有使用分析器,因为您使用了term
query,它会查找确切的术语。
您的title
字段已被分析(除非您另行指定),因此"google earth"
将被编入索引为["google","earth"]
这两个字词。这就是term
的{{1}}查询有效,但"google"
的{{1}}查询不起作用的原因 - 那个EXACT术语不存在。
如果您使用match
query,则会在搜索之前分析您的查询字词。
答案 1 :(得分:0)
对于那些最近磕磕绊绊的人,请注意以更简洁的方式来表示
{"query":{"bool":{"must":{"must_match":{"article.title":"google earth"}}}}}
是
{"query":{"match_phrase":{"article.title":"google earth"}}}
答案 2 :(得分:0)
我通过爆炸传递的短语来解决这个问题,所以只需要改变。
toy_model_parallel <- function(x){
f <- function(x){
x = x^2
}
set.seed(x[1])
2 * x[2] + f(2) + rnorm(1,0,0.1)
}
到
{"bool":{"must":{"term":{"article.title":"google earth"}}}}
它不漂亮,如果你有很多疑问,可能会太慢,但它确实有效。
注意,我刚刚发现这也将返回任何结果与&#34; google&#34;或者&#34;地球&#34;。
答案 3 :(得分:0)
使用Elasticsearch 5.4.2。,我的解决方案演变为以下一个:
{"query": {
"bool": {
"must": {
"match_phrase": {
"article.title": "google earth"}}}}}
希望这有助于某人。