如何在elasticsearch中对序数值进行排序?

时间:2016-01-06 01:25:38

标签: elasticsearch

说我有一个领域' spicey'具有可能的价值观' hot',' hotter','吸烟'

这些价​​值观具有内在的特征:它们是正常的。

我希望能够使用其内在顺序对它们进行排序或过滤。例如:给我所有文件,其中spicey>热。

当然,我可以将值转换为整数0,1,2,但这需要在索引和查询方面进行额外的内务管理,而我应该避免这样做。

这有可能吗?已经考虑过使用多字段映射,但不确定这是否对我有帮助。

2 个答案:

答案 0 :(得分:3)

您可以通过编写排序操作脚本对字符串值进行排序,以便为每个spicey字符串设置特定的字段值。

curl -XGET 'http://localhost:9200/yourindex/yourtype/_search' -d 
{
  "sort": {
    "_script": {
      "script": "factor.get(doc[\"spicey\"].value)",
      "type": "number",
      "params": {
        "factor": {
          "hot": 0,
          "hotter": 1,
          "smoking": 2
        }
      },
      "order": "asc"
    }
  }
}

答案 1 :(得分:2)

一种解决方案可能是为spice级别创建一个特定的分析器。我们的想法是将每个级别映射到离散值,这会增加香料的辛辣度。

{
  "settings": {
    "analysis": {
      "char_filter": {
        "spices": {
          "type": "mapping",
          "mappings": [
            "mild=>1",
            "hot=>2",
            "hotter=>3",
            "smoking=>4"
          ]
        }
      },
      "analyzer": {
        "spice_synonyms": {
          "type": "custom",
          "char_filter": "spices",
          "tokenizer": "standard",
          "filter": [
            "standard"
          ]
        }
      }
    }
  },
  "mappings": {
    "ordinal": {
      "properties": {
        "spicy": {
          "type": "string",
          "fields": {
            "level": {
              "type": "string",
              "analyzer": "spice_synonyms"
            }
          }
        }
      }
    }
  }
}

在上述索引设置和映射中,spicy字段将包含普通英语单词(hotmild等),而spicy.level字段将包含离散值,然后您可以在查询和排序中使用。

例如,检索spice级别严格大于hot并按降序排序(先吸烟)的文档可以这样做:

{
  "sort": {
    "spicy.level": "desc"
  },
  "query": {
    "query_string": {
      "query": "spicy.level:>2"
    }
  }
}

range查询也可以使用

{
  "sort": {
    "spicy.level": "desc"
  },
  "query": {
    "range": {
      "spicy.level" {
        "gt": 2
      }
    }
  }
}