在Elasticsearch中使用哪个查询tp执行所有子字符串匹配的结果?

时间:2015-08-18 14:44:22

标签: elasticsearch elasticsearch-query

我想实现一个商店名称搜索功能,现在如果我写了一个商店名称" nite out"那么我希望我的结果包含所有子字符串" nite"和" out"并且" nite out"也。

我尝试使用前缀查询,但无法执行此操作。我听说过模糊查询,但不知道它会解决我的问题。

任何人都可以告诉我应该使用哪个ES查询来获取" nite out"匹配的结果在顶部和休息" nite"和" out"结果也低于" nite out"匹配的结果。

1 个答案:

答案 0 :(得分:2)

我假设您已将数据编入索引,niteoutnite out是与任何文档匹配的令牌。

其中一种方法是使用Match Query。匹配查询使用分析器来获取您要查找的fuzziness。在这种特定情况下,我们可以使用空白分析器来获得您正在寻找的结果。它将查看查询nite out并将其拆分为niteout。然后,匹配查询将搜索这两个令牌,并根据相关性进行评分。将nite out分析为niteout的文档的得分高于仅niteout的文档。

这是一个使用动态映射的三个文档示例:

索引我们的文档:

PUI   {"value":"out"}
PUT   {"value":"nite"}
PUT   {"value":"nite out"}

现在构建查询:

GET _search
{
   "query": {
      "match": {
         "value": {
            "query": "nite out",
            "analyzer": "whitespace"
         }
      }
   }
}

我们实际上并不需要在这里指定空白分析器,实际上我们可以完全删除该行(和前面的逗号)。匹配查询将在我们在索引时查询的字段使用的分析器上运行查询文本。在我们的例子中,它是标准分析器,它将文本分为niteout

结果:

"hits": [
         {
            "_index": "test",
            "_type": "test",
            "_id": "1",
            "_score": 0.2712221,
            "_source": {
               "value": "nite out"
            }
         },
         {
            "_index": "test",
            "_type": "test",
            "_id": "2",
            "_score": 0.04500804,
            "_source": {
               "value": "nite"
            }
         },
         {
            "_index": "test",
            "_type": "test",
            "_id": "3",
            "_score": 0.04500804,
            "_source": {
               "value": "out"
            }
         }
      ]

我建议您阅读this link here以了解弹性搜索中的不同搜索机制