当前位置: 首页 > 面试题库 >

Elasticsearch:如果查询在索引数组中至少包含一项中的所有单词,如何只返回文本搜索查询的结果?

孔鸿哲
2023-03-14
问题内容

我有一个简单的文档,其中包含一个名为“关键字”的字段,该字段被索引用于文本搜索。关键字是单词和短短语的数组,如下所示:

{“关键字”:[“餐厅经理”,“厨师”,“公共汽车男孩”]}

查询必须包含文档关键字中至少一项的所有单词,以便返回该文档。

例子:

  • “经理”不应返回此文档。

  • “ bus”和“ manager”不应返回此文档。

  • “餐厅经理”应返回此文档。

  • “ chef”应html" target="_blank">返回此文档。

  • “餐厅经理厨师”应返回此文档,并获得更高的分数。

  • “餐厅经理无关字词”应返回此文档。

  • “餐厅经理巴士”应返回此文档,但理想情况下,其得分不应高于“餐厅经理”。

评分很重要,因此我需要使其成为查询而不是过滤器。

我正在使用Elasticsearch 1.7。


问题答案:

这可以通过以下设置来实现。

POST your_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "keyword_analyzer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ],
          "tokenizer": "keyword"
        },
        "shingle_analyzer":{
          "type" : "custom",
          "filter" :["lowercase","shingle_filter"],
          "tokenizer" : "standard"
        }
      },
      "filter": {
        "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 2,
          "max_shingle_size": 5
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "keywords": {
          "type": "string",
          "index_analyzer": "keyword_analyzer",
          "search_analyzer": "shingle_analyzer"
        }
      }
    }
  }
}

在这里,由于需求analyzers,我使用了两种不同的方法,一种用于indexing和一种用于searchingkeyword_analyzer需要按原样索引该词,以便对
经理的 查询不会与 饭店经理
一起返回文档。有关关键字分析器的更多信息。现在,搜索需要带状滤波器以phrases从输入文本生成。像 This restaurant manager那样的
文本将被分成 This restaurantrestaurant managermanager is
等等,您将获得期望的结果。您可以使用分析API来查看分析器的工作方式。


您可以像这样索引文档

PUT your_index/your_type/1
{
  "keywords": ["restaurant manager", "chef", "bus boy"]
}

这种类型的查询将为您提供文件

GET your_index/_search
{
  "query": {
    "match": {
      "keywords": "This restaurant manager is also a good chef"
    }
  }
}

希望这可以帮助!



 类似资料:
  • 我是Elasticsearch的新手,我面临一个问题。我的任务是搜索一组文档。例如,我有这样结构的数据: 但是困难的是,我如何获取所有带有project_id=abc的文档,然后通过与关键字“测试”匹配的任何其他字段(代码、名称、状态)搜索它们(例如)。我如何在Elasticsearch查询中做到这一点,请帮助我! 谢谢

  • 问题内容: 我们可以像这样在特定document.field中搜索所有单词: 这将搜索词,并在该领域,从而只返回这些文档将在所有这些词场。 但是我想做的却有些不同。 我想进行查找,以便如果该文档字段的所有单词都出现在我的搜索查询中,则它将返回该文档。 例如 假设Elasticsearch数据库中有一个文档 现在,如果我搜索“ a”,它将返回该文档,因为document.title中的所有单词确实存

  • 问题内容: 我有一个运行中的elasticsearch的内存实例,并做了一些探索性的编码来学习搜索Java API。我能够将文档提交到索引并使用GET检索它们,但是当我尝试简单的搜索查询时,没有得到任何结果。 经过一些测试后,我认为问题出在我如何设置节点和关联的客户端(在内存中): 问题答案: Googleelasticsearch小组中的某个人很友好,可以在这里帮助我。将文档提交到内存节点后,我

  • 问题内容: 通过以下查询,我得到的结果包含单词“ International”和“ Shipping”,我还得到了包含“ International”或“ Shipping”的结果。我该怎么做才能确保结果同时包含两个单词而不只是其中之一? 任何帮助将不胜感激,谢谢! 问题答案: 在每个必需的单词前添加一个,然后使用。 11.8.2。 布尔全文搜索 在实现此功能时,MySQL使用了有时称为隐式布尔逻

  • 问题内容: 如何在Elasticsearch中按数组索引查询/过滤? 我有一个像这样的文件: 我想搜索 LIN [0] 是否为“ UP”并且 LIN [1]是否 存在。 谢谢。 问题答案: 这看起来可能像hack,但是可以肯定地起作用。首先,我们将令牌计数类型与多字段一起应用以捕获令牌数量作为字段。因此,映射将如下所示- 链接-http: //www.elasticsearch.org/guide

  • 问题内容: 我有以下Elasticsearch查询。 假设我想从此搜索查询中排除。该文档指出以下内容: 它还支持通配符,例如:test ,以及“添加”(+)和“删除”(-)的功能,例如:+ test ,-test3。 据我了解,我应该能够执行以下操作。 但是,出现以下错误。 如果删除加号和减号,则查询运行正常。如果添加通配符,它​​似乎可以工作,例如以下查询。 但是,这并不是我真正想要的。 当我使