当前位置: 首页 > 知识库问答 >
问题:

使用短语(而不是单个单词/标记)的ElasticSearch布尔过滤器

夏兴平
2023-03-14

在弹性搜索中,此过滤器

{
  "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"
      }
    }
  }]
}
}
{
  "query": {
    "bool": {
      "must": {
        "must_match": {
          "article.title": "google earth"
        }
      }
    }
  }
}
{
  "size": 200,
  "filter": {
    "query": {
      "bool": {
        "must": {
          "must_match": {
            "article.title": "google earth"
          }
        }
      }
    }
  }
}

FWIW,我在“filter”字段中有此条件的原因是(与使用标准查询相反),有时我希望使用“must_not”而不是“must_not”,有时我还向查询添加其他元素。

共有1个答案

令狐增
2023-03-14

Elasticsearch根本没有使用分析器,因为您使用了术语查询,它查找确切的术语。

您的标题字段将被分析(除非您另有指定),因此“Google Earth”将被索引为两个术语[“Google”,“Earth”]。这就是为什么“Google”术语查询有效,而“Google Earth”术语查询无效的原因--确切的术语不存在。

如果使用match查询,则在搜索之前将分析查询术语。

 类似资料:
  • 问题内容: 我想知道是否可以过滤不良语言的单词。过滤亵渎行为的一个示例是用户创建帐户时的用户名,这样它可以通知用户该词是不可接受的。 可能吗?谢谢 :) 问题答案: 不,不可能使用任何编程语言来过滤不良语言单词。 您能做的最好的事情就是创建一个不良语言单词列表,然后对照该列表进行检查。只要系统存在,就将单词添加到列表中。 这是一个简单的示例来说明问题。让我们假设“地狱”是一个不好的语言单词。这是“

  • 问题内容: 我尝试使用Elasticsearch为我的内容实现A-Z导航。我需要的是显示所有以a,b,c等开头的结果。 我试过了: 上面提到的查询还显示结果,其中字符串中的单词以a开头。例: “ title”:“ Apfelpfannkuchen”, “ title”:“ Affogato”, “ title”:“ Kalbsschnitzel a n A ceto Balsamico”, 我只想

  • 我在ES中有两个问题。对于同一组文档,两者的周转时间都不同。两者在概念上都在做同样的事情。我没有什么疑问 1-这两者之间有什么区别?2-哪个更好使用?3-如果两者相同,为什么表现不同? 映射: 更新1: 我在同一组数据上尝试了bool/必须查询和bool/过滤器查询,但我发现了奇怪的行为 1-bool/必须查询能够搜索所需的文档 2-虽然bool/filter无法搜索文档。如果我删除第二个字段条件

  • 我试图编写一个由2个部分组成的弹性搜索布尔查询。我想要“必须”的两个条件和“应该”的两个条件。问题是我只想得到“应该”的分数。我尝试了“过滤器”,但没有成功。 你有什么想法吗?

  • 问题内容: 我有一个,并且效果很好,直到我在输入中添加了一个空格。例如,如果我列出了许多历史事件(英国战役(1940年),大爆炸战役(1944年),[插入大量战斗],拿破仑的致命游行(1812年),[插入许多其他历史事件]) 。 当我输入“ ”或“ ”时,我会得到所有战斗的列表(尽管似乎有最大战斗),而当我输入“ ”时,结果会出现。 但是,当我输入时,该列表为空,与输入时我没有得到任何匹配的原因相

  • 我从事elasticsearch,我尝试混合两个工作查询。第一个是“and filter”,第二个是“bool filter”,但我失败了。 我的查询是从用户交互界面动态生成的。 “和过滤器”: 我需要“和过滤器”来查询数据,例如,字段必须等于“非洲”或“亚洲”或为空。这是一个工作查询的示例: 此查询工作正常,结果如下: 现在我需要用字段“D\u TYPESTATUS”来限制结果数据,该字段必须与