text field是keyword 在es中存的 我应该怎么查
时间: 2024-03-01 10:51:21 浏览: 114
如果您的 `text field` 字段在 Elasticsearch 中被存储为 `keyword` 类型,那么您可以使用精确匹配查询来查找匹配的文档。可以使用以下步骤:
1. 使用 Kibana 或其他 Elasticsearch 客户端连接到 Elasticsearch 集群。
2. 在查询语句中指定您要查询的字段和要匹配的值。例如,如果您要查找名称为 "John Smith" 的文档,可以执行以下查询语句:
```
GET /my_index/_search
{
"query": {
"match_phrase": {
"text_field": "John Smith"
}
}
}
```
在这个查询中,`text_field` 是要查询的字段名称,`"John Smith"` 是要匹配的值。使用 `match_phrase` 查询可以确保匹配的文档包含完全匹配的短语。
3. 执行查询并查看结果。如果有匹配的文档,它们将作为响应返回。
请注意,如果您的 `text field` 字段是一个长文本,它可能不适合存储为 `keyword` 类型,因为这种类型通常用于存储短文本或标识符。如果您需要执行全文搜索或其他高级搜索操作,您可能需要将字段存储为 `text` 类型,并使用适当的分析器进行处理。
相关问题
8-3 ES检索信息 分数 10 作者 薛印 单位 中原工学院 有如下需求:根据输入关键字检索博客信息;请根据下面已有代码,补全业务逻辑。 PostDocment实体类: @Data @Document(indexName="post", type="post", createIndex=true) public class PostDocment implements Serializable { @Id private Long id; // ik分词器 @Field(type = FieldType.Text, searchAnalyzer="ik_smart", analyzer = "ik_max_word") private String title; @Field(type = FieldType.Long) private Long authorId; @Field(type = FieldType.Keyword) private String authorName; private String authorAvatar; private Long categoryId; @Field(type = FieldType.Keyword) private String categoryName; private Integer level; private Boolean recomment; private Integer commentCount; private Integer viewCount; @Field(type = FieldType.Date) private Date created; } PostRepository: @Repository public interface PostRepository extends ElasticsearchRepository<PostDocment, Long> { } SearchService接口(Page类型是org.springframework.data.domain): public interface SearchService { Page search(Long current, Long size, String keyword); } SearchServiceImpl实现类: @Slf4j @Service public class SearchServiceImpl implements SearchService { @Autowired PostRepository postRepository; /** * 实现根据关键词检索,关键词可能匹配title,也可能匹配authorName或者categoryName * @param current 查询的当前页 * @param size 每页展示size * @param keyword 查询关键词 * @return */ public org.springframework.data.domain.Page search(Long current, Long size, String keyword ) { } 控制层此处省略...... 注意:es中可能设计的操作QueryBuilders.multiMatchQuery(Object text, String... fieldNames); QueryBuilders.MatchQuery(Object text, String fieldNames); QueryBuilders.boolQuery().......
可以根据以下代码补全业务逻辑:
```
@Slf4j
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
PostRepository postRepository;
/**
* 实现根据关键词检索,关键词可能匹配title,也可能匹配authorName或者categoryName
* @param current 查询的当前页
* @param size 每页展示size
* @param keyword 查询关键词
* @return
*/
public org.springframework.data.domain.Page search(Long current, Long size, String keyword ) {
// 构建查询条件
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("title", keyword));
boolQueryBuilder.should(QueryBuilders.matchQuery("authorName", keyword));
boolQueryBuilder.should(QueryBuilders.matchQuery("categoryName", keyword));
// 构建查询分页
Pageable pageable = PageRequest.of(current.intValue() - 1, size.intValue());
// 执行查询
return postRepository.search(boolQueryBuilder, pageable);
}
}
```
说明:
1. 构建查询条件时,使用 BoolQueryBuilder 来构建,使用 should 方法添加多个查询条件,表示只要有一个条件匹配成功,就可以返回结果。
2. 使用 QueryBuilders.matchQuery 方法来构建查询条件,指定要匹配的字段和关键词。
3. 构建查询分页时,使用 PageRequest.of 方法来构建,指定当前页码和每页展示的数量。
4. 执行查询时,使用 postRepository.search 方法来执行查询。
在启动elasticsearch集群时第一台机子启动elasticsearch后报这条错误java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [type] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead.
这个错误提示是因为你在使用text类型的字段上启用了聚合(aggregation)或排序(sorting)等需要使用fielddata的功能。fielddata是一种用于在内存中加载倒排索引数据的机制,但它需要占用相当大的内存。
解决这个问题的方法有两个:
1. 在mapping中将该字段的fielddata设置为true,例如:
```
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}
}
}
```
2. 使用keyword类型的字段进行聚合或排序,例如:
```
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"my_field": {
"type": "keyword"
}
}
}
}
}
```
这样做的话,你就可以在使用聚合或排序功能时避免使用fielddata。
阅读全文