多领域的弹性研究

时间:2016-03-15 11:27:31

标签: json elasticsearch

我想在包含几个字段的文档中搜索关键字。 搜索应仅在两个字段上进行:id和name。

我需要编写一个具有以下属性的查询: 如果您的搜索输入(关键字)是数字,并且在ID字段和名称字段中有两个不同的记录包含此关键字,则应首先显示具有id字段的记录(它不必是ID字段中的完美匹配)。

例如,如果我有这两个记录: 1. id:5名称:" kuku" 2. id:10名称:" kuku523"

我寻找" 5"作为关键字,我应该获得第一条记录的更高分数(在点击列表中)。

" id"字段是数字,"名称" field是一个字符串。

我一直在尝试使用matchQuery,multiMatchQuery和fuzzyLikeThis。

multiMatchQuery为第二个记录而不是第一个记录提供了更高的分数,这对我来说看起来很奇怪(因为在第一条记录上有一个"完美匹配")。

setQuery(QueryBuilders.multiMatchQuery(searchParam, ID, NAME));

和fuzzyLike这引发了关于数字字段的异常。

setQuery(QueryBuilders.fuzzyLikeThisQuery(ID,NAME).likeText(searchParam))
tremQuery并没有真正提供解决方案。

我应该在这样的情况下使用什么查询?

1 个答案:

答案 0 :(得分:1)

您需要将id设为String字段,因为全文搜索不适用于数字字段。

OR

如果您仍需要id字段作为术语查询的数字,则可以使用多字段 创建一个多字段,其中包含一个数字字段以及一个用于搜索的字符串

PUT /test/items/_mapping
{
  "items" : {
    "properties" : {
      "id" : {
          "fields" : {
            "numeric" : {
              "type" : "integer",
              "index" : "not_analyzed"
            },
            "text" : {
              "type" : "string",
              "index" : "analyzed"
            }
          }
        }
      }
    }
}

现在,您可以使用id.numeric进行数字查询,使用id.text进行文字查询