弹性搜索子字符串匹配

时间:2019-05-26 07:29:35

标签: elasticsearch full-text-search

我有一个包含这样的索引的弹性搜索节点:

"_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 bedroom Mirpur”时

包含7个卧室的索引也会出现。

在这里查询/

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

有人可以帮助我吗?我是弹性搜索的菜鸟。

1 个答案:

答案 0 :(得分:0)

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

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

因此,在您的情况下,输入“ bedroom:3 Mirpur”是3个单词“ bedroom”,“ 3”和“ Mirpur”中的问题,并且将对索引中“ fttext”字段内的所有文档进行搜索,并且返回结果。

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

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