java - Elastic Search - 通过字段的起始字符获取记录

标签 java elasticsearch

我正在使用 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);

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

最佳答案

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

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

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

如果您希望您的消息字段“未标记”(视为单个字符串),您必须显式地将此字段的映射设置为关键字。这是通过使用映射 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/

关于java - Elastic Search - 通过字段的起始字符获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16792553/

相关文章:

java - 比较两个通用复杂对象java

Java 6 SE vector 过时了吗?

用于读取 Microsoft Excel 文件的 Java 库

node.js - 使用 HTTP 模块在 Node.js 上查询 ElasticSearch 忽略请求正文

elasticsearch - 当查询文本为字母数字模式时,Elasticsearch返回所有记录

java - Tomcat AD 身份验证 - 允许所有 AD 用户

java - 创建一个简单的定时 Java 测验

path - Elasticsearch - 使用路径层次分词器访问不同级别的类别

elasticsearch - 如何使用logstash将Kafka主题键值索引为字段?

elasticsearch - 根据字符串值汇总数据