java - ElasticSearch 将所有字段值返回为 null
问题描述
我的配置:
@Configuration
@EnableElasticsearchRepositories(
basePackages = { "com.aj.new.repositories" })
public class ElasticDataSourceConfig {
@Bean
public RestHighLevelClient client() {
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
.connectedTo("localhost:9200")
.build();
return RestClients.create(clientConfiguration).rest();
}
@Bean
public ElasticsearchRestTemplate elasticsearchTemplate() {
return new ElasticsearchRestTemplate(client());
}
}
文档:
@Document(indexName = "provider_search")
public class Provider {
@Id @Field
private Long id;
@Field(type = FieldType.Keyword)
private String search;
@Field(name = "ProviderName", type = FieldType.Keyword)
private String providerName;
@Field(name = "Address")
private String address;
@Field(name = "City")
private String city;
@Field(name = "State")
private String state;
...getters...
...setters...
}
用法:
@Service
public class MySearchService {
@Autowired
private ElasticsearchRestTemplate elasticsearchRestTemplate;
public List<Provider> searchProvidersUsingElastic(final String
providerName, final AddressSearchCriteriaBean addressCriteria) {
final NativeSearchQueryBuilder searchQueryBuilder = new
NativeSearchQueryBuilder();
if (providerName != null) {
final String regex = ".*" + providerName + ".*";
searchQueryBuilder.withQuery(regexpQuery("providerName", regex));
}
if (addressCriteria.getState() != null) {
searchQueryBuilder.withFilter(matchQuery("state",
addressCriteria.getState())
.fuzziness(Fuzziness.ONE));
}
SearchHits<Provider> articles =
elasticsearchRestTemplate.search(searchQueryBuilder.build(),
Provider.class, IndexCoordinates.of("provider_search"));
final List<Provider> providers = articles
.stream()
.map(SearchHit::getContent)
.collect(Collectors.toList());
return providers;
}
}
在使用或不使用过滤器进行调试时,我得到的提供者只填充了他们的 ID 字段。像“搜索”、“状态”等所有其他字段都是空的。
这是我在 ElasticSearch 世界中的第一次冒险,我不确定这里出了什么问题。任何帮助表示赞赏。
编辑:
来自 Elasticsearch 的提供者映射
{
"provider_search": {
"mappings": {
"properties": {
"Address": {
"type": "text",
"analyzer": "autocomplete"
},
"City": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"FaxNumber": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"PhoneNumber": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"ProviderName": {
"type": "text",
"analyzer": "autocomplete"
},
"State": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Status": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"Zip": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"fac_dbk": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"search": {
"type": "text",
"analyzer": "autocomplete"
}
}
}
}
}
请注意,出于测试目的,我没有在 Java 端映射 Provider 的每个字段。如果这有问题,请告诉我。
第二次更新:
我已更改 Provider 文档以按原样映射字段名称。尽管如此,除了 id 之外的所有内容仍然为空。
@Document(indexName = "provider_search")
public class Provider {
@Id
private Long id;
private String search;
private String ProviderName;
private String Address;
private String City;
private String State;
...getters...
...setters...
}
更新:
原来 Elasticsearch 索引有一个错误,我在 Java 端映射的字段在 ES 索引上不可用。它已被修复,我看到所有值都正确填充。
解决方案
您在使用属性名称(Provider
实体的属性)和相应的字段名称(Elasticsearch 中的名称)时存在不一致。
您的属性以小写字母开头,然后是驼峰式 ( providerName
, ),对于 Spring Data Elasticsearch,您将它们定义为映射到以大写字母 ( , )state
开头并带有注释的版本。因此 Spring Data Elasticsearch 期望 Elasticsearch 返回一个值,然后将其存储在属性中。ProviderName
State
@Field
ProviderName
providerName
索引中的字段名称是否以大写字母开头?http://localhost:9200/provider_search/_mappings 显示什么?这是一个猜测,因为您没有显示 Elasticsearch 返回的内容,但会解释您的错误。
推荐阅读
- gcc - make 无法在 Windows 10 上使用 msys2 正确 ld libssh 库
- node.js - Mongoose:转换现有集合中的 _id 类型
- reactjs - 表单提交路线
- python - 处理和返回一组组中的数据
- c++ - 从编辑中获取价值以使用区域
- mysql - 使用 TOAD for Mysql 调试 Mysql 存储过程
- javascript - 在数组中按单个字符搜索对象
- r - 使用两个 csv 文件(两个文件都有 2 列),我们如何在 R 中绘制(作为单个网络图)节点列表和边缘列表社交网络分析?
- android - 在androud studio arctic fox 2020.3.1中构建APK时如何生成output.json而不是output-metadata.json
- typescript - 使用 TypeScript 在 Quasar 中声明第三方模块