我正在研究使用Elasticsearch 5.2的项目。该代码在Java中,我使用elasticsearch Java Client 5.2。
在这个项目中,我有一个名为hash的字段,它是7个字符的代码,其中包含大写字母,小写字母和数字(英语)。 我想在此字段上进行两次搜索:
检查是否存在哈希"ErTg1Qh"
(区分大小写)
查找子字符串s中包含的哈希(例如,子字符串"tg"
存在于哈希"ErTg1Qh"
中)。
对于散列字段,我选择了关键字数据类型。
我使用matchQuery函数进行第一次搜索,如下所示:
String hash = "ErTg1Qh";
QueryBuilders.matchQuery("hash", hash)
和queryStringQuery函数用于第二次搜索,如下所示:
queryString = "hash:*" + subString + "*";
QueryBuilders.queryStringQuery(queryString)
但是,第二个不能正常工作。
如何在字段上处理这两种搜索?
答案 0 :(得分:2)
您的一个查询要求区分大小写,而第二个查询则不区分大小写。因此,我建议您将子字段用作哈希字段。您的主字段将使用小写分析器进行分析,一个主字段将存储原始数据,即确切的哈希值。因此您的索引如下所示:
PUT /test
{
"settings": {
"number_of_shards": "1",
"number_of_replicas": "0",
"analysis": {
"analyzer": {
"custom_lowercase": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "keyword"
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"hash": {
"type": "text",
"analyzer": "custom_lowercase",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
查询以检查是否存在哈希“ ErTg1Qh”(区分大小写)
POST /test/_doc/_search
{
"query": {
"match": {
"hash.keyword": "ErTg1Qh"
}
}
}
查询以查找子字符串s中包含的哈希
POST /test/_doc/_search
{
"query": {
"query_string": {
"query": "*tg*"
}
}
}