Elasticsearch的同一文件中的全文搜索以及术语搜索

时间:2017-02-22 05:25:12

标签: elasticsearch elasticsearch-5 elasticsearch-dsl elasticsearch-query elasticsearch-mapping

我来自MySql背景。所以我不太了解弹性搜索及其工作。

这是我的要求

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

enter image description here

此图片将提供更好的理解。

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

以下是我目前应用的内容,它使排序和术语搜索启用,但全文搜索无法正常工作。

{
    "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"
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

默认映射用于术语搜索,因此当需要术语搜索时,您可以在“城市”字段中进行简单查询。但是,您需要全文搜索,必须在“city.fulltext”上执行查询。希望这会有所帮助。

答案 1 :(得分:0)

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

您需要使用multi-fields

  

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

例如:

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

使用点符号按city.raw排序:

{
  "query": {
    "match": {
      "city": "york" 
    }
  },
  "sort": {
    "city.raw": "asc" 
  }
}