首页 > 解决方案 > 弹性搜索子字符串匹配

问题描述

我有包含如下索引的弹性搜索节点:

"_index" : "barivara",
       "_type" : "_doc",
       "_id" : "3",
       "_score" : 1.0,
       "_source" : {
         "area" : "Mirpur",
         "address" : "house:5; MIrpur",
         "description" : "home",
         "price" : 400,
         "number of members" : 5,
         "building amenities" : "5",
         "number of bed" : 7,
         "number of bath" : 2,
         "rentaltype" : "flat",
         "fttext" : "Mirpur 7 bedroom 2 bathroom flat 10 members"
       }
     }

我添加了全文搜索的文本字段,但是当我搜索“3卧室Mirpur”时

包含 7 间卧室的索引也出现了。

这是我的查询/

GET /barivara/_search
{
  "query": {
    "bool": {
      "must": {
        "match": { 
          "fttext": {
            "query":                "bedroom:3 Mirpur",
            "minimum_should_match": "100%"
          }
        }
      }
    }
  }
}

有人能帮我吗?我是弹性搜索的菜鸟。

标签: elasticsearchfull-text-search

解决方案


您需要提供有关您配置的分析器类型的更多信息,以及文档的架构是什么,假设它们是标准的,这是我的看法。

  1. 根据分析器将查询转换为令牌
  2. 然后根据内部倒排索引,找出与它们匹配的所有文档
  3. 然后根据相关性得分,对它们进行排序并返回结果。

因此,在您的情况下,输入“bedroom:3 Mirpur”被分解为 3 个单词“bedroom”、“3”和“Mirpur”,并搜索索引中字段“fttext”中的所有文档,并返回结果.

因此,在您的情况下,“7 卧室”文档也将显示为3 个术语中的 2 个与这些文档匹配,但此类文档将放置在“3 卧室”文档下方

注意:假设 fttext在您的架构中是“文本”类型而不是“关键字”类型。索引期间未分析的关键字并存储为“整个单词”。所以“包含”对它们不起作用,精确搜索可以。


推荐阅读