2016-03-15 49 views
1

我想在具有几个字段的文档中搜索关键字。 搜索应该只发生在两个字段上:id和name。elasticsearch在多个字段上

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

例如,如果我有这两个记录: 1. ID:5名: “裤裤” 2 ID:10名: “kuku523”

,我期待为 “5” 为关键词,我应该得到第一个记录的更高分(在命中列表中)。

“id”字段是数字,“name”字段是字符串。

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

multiMatchQuery给第二张唱片提供了更高的分数,而不是第一张唱片,这对我来说看起来很奇怪(因为第一张唱片上有一个“完美匹配”)。

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

and the fuzzyLike这引发了一个有关数字字段的异常。

setQuery(QueryBuilders.fuzzyLikeThisQuery(ID,NAME).likeText(searchParam)) 

tremQuery并没有真正给出解决方案。

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

回答

1

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

OR

如果您仍然需要id领域是数字的字词的查询,你可以使用multifields 创建一个多领域,将包含许多领域,也是一个字符串搜索

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

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

+0

它可以使用java API来完成它吗? – user3169643

+0

什么部分?查询或映射? – Rahul

相关问题