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

elasticsearch - ElasticSearch 高效匹配邻近关键字?

栾峰
2024-01-17

elasticSearch搜索:比如,我有一个关键字是“北京地铁”,但是我只想搜索挨着的关键词,比如搜索【北京】或者搜索【地铁】或者在搜索【北京地铁】这种的可以保证能匹配到,但是如果隔词搜索就不让他显示出来,比如:【北地】,【京铁】,这种隔词了,就不让搜索出来如何处理,不采用match_phrase的方法,还有没有更加高效的方法?

我尝试过使用match_phrase可以做到我要的结果,但是match_phrase效率不是很高;

共有1个答案

尤飞尘
2024-01-17

要实现高效匹配邻近关键字,除了使用match_phrase查询外,还可以考虑以下几种方法:

  1. 使用bool查询结合matchrange查询
* 对于连续的关键字,你可以使用`bool`查询结合`match`和`range`查询。例如,要搜索“北京地铁”,你可以使用以下查询:```json`{  "query": {    "bool": {      "must": [        { "match": { "field": "北京" } },        { "match": { "field": "地铁" } }      ]    }  }}````* 这种方法适用于关键字之间没有其他文本的情况。如果关键字之间有文本,可以使用`range`查询来确保关键字的距离。例如:```json`{  "query": {    "bool": {      "must": [        { "match": { "field": "北京" } },        { "range": { "keyword_distance": { "gte": 1 } } },        { "match": { "field": "地铁" } }      ]    }  }}````
  1. 使用script查询
* Elasticsearch允许使用脚本来进行更复杂的查询。你可以编写一个脚本来检查关键字之间的距离。例如,以下脚本可以用于检查“北京”和“地铁”之间的距离:```bash`boolQuery=true;for (int i = 0; i < terms.length - 1; i++) {  if (terms[i].equals("北京") && terms[i+1].equals("地铁")) {    boolQuery=false; // if '北京' and '地铁' are consecutive, set boolQuery to false    break;  }}return boolQuery;````
  1. 使用prefix查询
* 对于连续的关键字,你还可以使用`prefix`查询来提高效率。例如,要搜索“北京地铁”,你可以使用以下查询:```json`{  "query": {    "bool": {      "must": [        { "prefix": { "field": "北京" } },        { "prefix": { "field": "地铁" } }      ]    }  }}````
  1. 优化索引
* 确保你的索引已经优化,包括使用合适的分析器、停用词、大小写敏感度等设置。优化索引可以提高查询性能。
  1. 使用更高效的数据结构
  2. 在某些情况下,可以考虑使用更高效的数据结构来存储和检索数据,以提高匹配邻近关键字的效率。例如,可以考虑使用倒排索引、Trie树等数据结构。
 类似资料:
  • 我想同时执行精确的单词匹配和部分单词/子字符串匹配。例如,如果我搜索“test product”,那么我应该能够在结果中找到“test”和“product”相关的文本。我用下面的match查询搜索弹性搜索,它不是给我精确的匹配,而是给我一些更多的不确定的匹配。示例是在结果中给出与“sample”相关的文本。 我使用弹性搜索6.3 请在下面找到我的查询 搜索结果:“Hits”:[{“_index”:

  • 我和ElasticSearch一起工作。当我执行此查询时: 我得到了我想要的(所有的结果,其中有参考黑莓,但不是Q10)。 但是,我想限制搜索的字段只限于“title”字段。例如,_source文档有标题、正文、标签等,我只想搜索标题。ElasticSearch“匹配”似乎很适合我... 虽然这只成功地搜索了标题,但它仍然返回标题中带有Q10的结果,这与上面的搜索不同。 我正在看比赛文档,但似乎不

  • 问题内容: 我正在使用Elasticsearch,但有一段时间魔鬼般地要进行精确匹配。我已经尝试过match,query_string等的各种组合,但是我什么也没得到,或者得到了不好的结果。查询看起来像这样: 排序结果 我当然知道“狗”,“那只狗”和“狗”的得分相同,但是我需要弄清楚如何提高得分“狗”的精确匹配度。 我也试过 但这仍然给我 问题答案: 默认情况下,使用标准分析仪分析字段。如果您想检

  • 我在ES中有一个多匹配查询,希望添加一个过滤器。 添加此筛选器的语法是什么? 我试过:

  • 我在搜索包含逗号的名字时遇到了麻烦。例如,搜索'John Smith'不会返回'Smith,John'。 我的name字段被索引为textfield,我的搜索查询如下所示: 我添加了短语slop=1,以便在搜索“John Smith”时成功匹配像“John D Smith”这样的名字。但是如何修改查询以匹配带有逗号的名称呢?

  • 问题内容: 我有一个列表,数组或您熟悉的任何一种语言。例如,names:如果与这些名称之一匹配,我想查询该字段。 一种方法是使用OR过滤器。例如 有什么更好的办法吗?如果它是查询,则比过滤器更好。 问题答案: 哪一个Elasticsearch会像您曾经使用过的那样重写 在大多数情况下,使用布尔型过滤器时,使用过滤器比或更好。原因在Elasticsearch博客中进行了解释:http://www.e