0

我来自 MySql 背景。所以我对弹性搜索不太了解,它正在工作。

这是我的要求

在所有列上都会有一个带有排序选项的结果记录表。将有过滤器选项,用户可以从中选择多个列的多个值(例如,City 应该来自 City1、City2、City3,Category 应该来自 Cat2、Cat22、Cat6)。还将有搜索栏,用户将在其中输入一些文本,全文搜索将应用于某些字段(即城市、区域等)。

在此处输入图像描述

该图像将提供更好的理解。

我面临的问题是全文搜索。我尝试了一些映射,但每次我不得不在全文搜索或术语搜索上妥协。所以我认为没有任何方法可以将两种搜索应用于同一领域。但正如我所说,我对弹性搜索知之甚少。因此,如果有人有解决方案,将不胜感激。

这是我目前应用的,它使排序和术语搜索启用,但全文搜索不起作用。

{
    "mappings":{
        "my_type":{
            "properties":{
                "city":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "category":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "area":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "zip":{
                    "type":"string",
                    "index":"not_analyzed"
                },
                "state":{
                    "type":"string",
                    "index":"not_analyzed"
                }
            }
        }
    }
}
4

2 回答 2

0

全文搜索不适用于not_analyzed字段,排序不适用于analyzed字段。

您需要使用多字段

出于不同目的以不同方式索引同一字段通常很有用。这就是多领域的目的。例如,字符串字段可以映射为全文搜索的文本字段,以及排序或聚合的关键字字段:

例如 :

{
  "mappings": {
    "my_type": {
      "properties": {
        "city": {
          "type": "text",
          "fields": {
            "raw": { 
              "type":  "keyword"
            }
          }
        } ...
      }
    }
  }
}

使用点符号进行排序city.raw

{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  }
}
于 2017-03-29T19:07:31.283 回答
0

您可以使用具有两个映射的多字段更新映射,一个用于全文,另一个用于术语搜索。这是城市的示例映射。

{
    "city": {
        "type": "string",
        "index": "not_analyzed",
        "fields": {
           "fulltext": {
               "type": "string"
           }
         }
     }
}

默认映射是针对词条搜索的,所以当需要词条搜索时,您可以在“城市”字段中进行简单查询。但是,您需要全文搜索,必须在“city.fulltext”上进行查询。希望这可以帮助。

于 2017-02-23T03:03:35.037 回答