java long 类型 保存到 es 怎么变成了text类型
时间: 2023-02-11 16:08:17 浏览: 144
在 Elasticsearch 中,Java 的 long 类型会被映射为 Elasticsearch 的 "long" 类型。当将 Java 的 long 类型保存到 Elasticsearch 时,如果字段被映射为 "text" 类型,可能是因为在创建索引映射时为该字段指定了 "text" 类型或者在更新映射时将字段类型修改为了 "text"。或者你所使用的 Elasticsearch 的版本或者 工具会忽略数字类型的配置,会将其自动转化为text类型
相关问题
java代码利用RestHighLevelClient创建es索引并且指定字段类型的示例代码
在Java中,使用`RestHighLevelClient`库操作Elasticsearch(ES)时,创建索引并指定字段类型通常涉及到以下几个步骤。首先,你需要添加Elasticsearch客户端依赖,比如通过`elasticsearch-rest-high-level-client`库。
这是一个简单的示例代码片段,展示了如何创建一个名为`my_index`的新索引,并为特定字段指定类型:
```java
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
public class ElasticsearchExample {
private static final String INDEX_NAME = "my_index";
private static final String DOC_TYPE = "_doc"; // ES 7及以上版本默认类型
public static void main(String[] args) throws Exception {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 定义文档内容及其字段类型
Map<String, Object> document = new HashMap<>();
document.put("field1", "value1"); // 字符串字段
document.put("field2", 123); // 整数字段
document.put("field3", true); // 布尔字段
// 使用XContentBuilder构建JSON格式的文档
XContentType xContentType = XContentType.JSON; // 或者选择其他如XContentType.SMILE等
IndexRequest request = new IndexRequest(INDEX_NAME)
.source(xContentType.contentAsBytes(document), xContentType);
// 设置字段类型,这里假设"field1"是字符串,"field2"是long,"field3"是boolean
request.routing("some_routing_value"); // 如果需要路由
request.id("document_id");
request.docType(DOC_TYPE);
request.sourceParam().setFields(new FieldNameFieldDocValuesSource.Builder("field1")
.type("text") // 字符串字段设置为文本类型
.build(),
new FieldNameFieldDocValuesSource.Builder("field2")
.type("long") // 整数字段设置为长整型
.build(),
new FieldNameFieldDocValuesSource.Builder("field3")
.type("boolean") // 布尔字段设置为布尔类型
.build()
);
// 执行请求
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
System.out.println(response.getResult() + ", " + response.getIndicesStatus());
client.close();
}
}
```
在这个例子中,我们创建了一个包含三个字段的文档,并分别为它们指定了类型。注意,对于旧版本的Elasticsearch,可能会有不同的字段类型命名约定,比如在ES 6及之前版本中,`text`对应的是`analyzed`类型。
Java微服务项目:家具商城,搜索系统搭建用于 Lucene 全文检索的 Elasticsearch 服务器,创建商品索引库,使用 IK 分词器,同时定义分词,为用户搜索提供更准确的数据,最后将会检索出来的数据解析,以接口的方式给前台系统调用;实现代码流程
1. 首先,我们需要搭建Elasticsearch服务器。可以通过下载Elasticsearch的压缩包,解压后直接启动elasticsearch.bat(Windows系统)或elasticsearch命令(Linux系统)来启动Elasticsearch服务器。
2. 接下来,我们需要创建商品索引库。可以使用Elasticsearch提供的Java API来创建索引库。创建索引库的过程中,我们需要定义索引库的映射关系,即定义每个字段的数据类型和分词器。在这里,我们使用IK分词器来进行分词。可以使用以下代码来创建商品索引库:
```java
// 创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest("product");
client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
// 定义映射关系
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
{
builder.startObject("properties");
{
builder.startObject("id");
{
builder.field("type", "long");
}
builder.endObject();
builder.startObject("name");
{
builder.field("type", "text");
builder.field("analyzer", "ik_max_word");
builder.field("search_analyzer", "ik_max_word");
}
builder.endObject();
builder.startObject("description");
{
builder.field("type", "text");
builder.field("analyzer", "ik_max_word");
builder.field("search_analyzer", "ik_max_word");
}
builder.endObject();
builder.startObject("price");
{
builder.field("type", "double");
}
builder.endObject();
builder.startObject("image");
{
builder.field("type", "keyword");
}
builder.endObject();
}
builder.endObject();
}
builder.endObject();
PutMappingRequest putMappingRequest = new PutMappingRequest("product").source(builder);
client.indices().putMapping(putMappingRequest, RequestOptions.DEFAULT);
```
3. 然后,我们需要为商品建立索引。可以使用以下代码将商品数据添加到索引库中:
```java
// 建立索引
IndexRequest indexRequest = new IndexRequest("product");
indexRequest.id(product.getId().toString());
indexRequest.source("id", product.getId(),
"name", product.getName(),
"description", product.getDescription(),
"price", product.getPrice(),
"image", product.getImage());
client.index(indexRequest, RequestOptions.DEFAULT);
```
4. 接下来,我们需要实现搜索功能。可以使用Elasticsearch提供的Java API来进行搜索。在搜索之前,我们需要先定义查询条件。在这里,我们使用MultiMatchQueryBuilder来进行多字段匹配。可以使用以下代码来实现搜索功能:
```java
// 定义查询条件
MultiMatchQueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, "name", "description");
// 搜索
SearchRequest searchRequest = new SearchRequest("product");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(queryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
// 解析搜索结果
List<Product> productList = new ArrayList<>();
SearchHits hits = searchResponse.getHits();
for (SearchHit hit : hits) {
Product product = new Product();
product.setId(Long.parseLong(hit.getId()));
product.setName(hit.getSourceAsMap().get("name").toString());
product.setDescription(hit.getSourceAsMap().get("description").toString());
product.setPrice(Double.parseDouble(hit.getSourceAsMap().get("price").toString()));
product.setImage(hit.getSourceAsMap().get("image").toString());
productList.add(product);
}
return productList;
```
5. 最后,我们需要将搜索功能以接口的方式提供给前台系统调用。可以使用Spring MVC框架来实现接口。可以使用以下代码来实现接口:
```java
@RestController
public class ProductController {
@Autowired
private ProductService productService;
@GetMapping("/search")
public List<Product> search(@RequestParam String keyword) {
return productService.search(keyword);
}
}
```
在上述代码中,我们使用@GetMapping注解来定义接口的请求方式,并使用@RequestParam注解来获取请求参数。然后,我们调用ProductService的search方法来进行搜索,并将搜索结果返回给前台系统。
综上所述,Java微服务项目:家具商城,搜索系统搭建用于Lucene全文检索的Elasticsearch服务器,创建商品索引库,使用IK分词器,同时定义分词,为用户搜索提供更准确的数据,最后将会检索出来的数据解析,以接口的方式给前台系统调用的实现流程如上所述。
阅读全文