3

我正在使用弹性搜索服务器。我需要根据源 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”。请给出任何解决方案来实现这一点。提前致谢。

4

1 回答 1

3

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

这意味着您的消息字段被视为多个术语字段。对于 JSON1 :["welcome", "to", "elastic", "search"]和 JSON2 : ["Hellow", "world"]

当您进行查询时,ElasticSearch 将尝试匹配术语,这就是为什么您会得到 JSON1 用于“欢迎”术语而 JSON2 用于“世界”术语。

如果您希望您的消息字段是“未标记的”(视为单个字符串),您必须明确将此字段的映射设置为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"}

您还可以使用分析 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/

于 2013-05-28T13:40:20.367 回答