弹性搜索 - 通过开始字段的字符来获取记录

时间:2013-05-28 12:50:30

标签: java elasticsearch

我正在使用弹性搜索服务器。我需要根据源JSON中字段值的起始字符获取记录。

JSON:

Index JSON1 : "{\"id\":\"1\",\"message\":\"welcome to elastic search\"}"
Index JSON2 : "{\"id\":\"1\",\"message\":\"Hellow world\"}"

代码:

String selectedCharacter = "w";
PrefixQueryBuilder queryBuilder = QueryBuilders.prefixQuery("message", selectedCharacter);
builder.setQuery(queryBuilder);

通过使用上面的代码,我得到了两个记录。 我只需要'索引JSON1'。请提供任何解决方案来实现这一目标。提前谢谢。

1 个答案:

答案 0 :(得分:3)

默认情况下,Elasticsearch会“标记”字符串字段。

这意味着您的邮件字段被视为多字词字段。对于JSON1:["welcome", "to", "elastic", "search"]和JSON2:["Hellow", "world"]

当您进行查询时,ElasticSearch将尝试匹配该术语,这就是为什么您为“世界”术语获得“欢迎”术语和JSON2的JSON1。

如果您希望消息字段为“未标记”(视为单个字符串),则必须将此字段的映射显式设置为keyword。这是通过使用Mapping API完成的。

你可以看一下:

如果您需要keyword分析器但不区分大小写,则需要使用lowercase过滤器定义自定义分析器(您可能需要删除并重新创建索引)。例如:

$ curl -XPUT 'localhost:9200/test/_settings' -d '
  {
    "index": {
      "analysis" : {
        "analyzer" : {
          "lowercaseAnalyzer": {
            "type": "custom",
            "tokenizer": "keyword",
            "filter": ["lowercase"]
          }
        }
      }
    }
  }

然后使用此自定义分析器而不是keyword来定义映射:

"message" : {"type" : "string", "analyzer" : "lowercaseAnalyzer"}

您还可以使用analyze API测试您的分析仪。例如:

$ curl -XGET 'localhost:9200/test/_analyze?analyzer=lowercaseAnalyzer&pretty=true' -d 'Hello world'
{
  "tokens" : [ {
    "token" : "hello world",
    "start_offset" : 0,
    "end_offset" : 11,
    "type" : "word",
    "position" : 1
  } ]
}

您可以在分析文档中查看所有可用的标记器和过滤器:http://www.elasticsearch.org/guide/reference/index-modules/analysis/