我试图在弹性搜索中寻找子字符串,但我所知道的以及我编码的内容并不像我想要的那样完全寻找子字符串
以下是我编码的内容:
BoolQueryBuilder query = new BoolQueryBuilder();
query.must(new QueryStringQueryBuilder("tagName : *"+tagName+"*"));
SearchResponse response = esclient.prepareSearch(index).setTypes(type)
.setQuery(query)
.execute().actionGet();
SearchHit[] hits = response.getHits().getHits();
for (SearchHit hit : hits) {
Map map = hit.getSource();
list.add((String) map.get("tagName"));
}
list = list.stream().distinct().collect(Collectors.toList());
for(int i = 0; i < list.size(); i++) {;
jsonArrayBuilder.add((String) list.get(i));
}
我试图实现的目标是查看给定标记名的一部分是否与任何内容相匹配。
但是,以防万一,如果我正在寻找一个名为&#34; social_security_number&#34;我打字#34;社会保障&#34;然后我希望它被列出来。 但实际发生的事情是,如果我错过了下划线,它就没有被列出。 有可能吗?我应该修改此代码以便这样搜索吗?
这是我的索引结构:
POST arempris/emptagnames
{
"mappings" : {
"emptags":{
"properties": {
"employeeid": {
"type":"integer"
},
"tagName": {
"type": "text",
"fielddata": true,
"analyzer": "lowercase_keyword",
"search_analyzer": "lowercase_keyword"
}
}
}
}
}
非常感谢您的帮助,并提前感谢您。
答案 0 :(得分:0)
您设置的分析器不会对任何内容进行标记,因此空间非常重要。指定将在空格和下划线以及您可能认为有用的任何内容上拆分的自定义分析器是一个很好的解决方案。以下内容可行,但请仔细检查分析仪的功能,并查看您不了解的每个部分的文档。
PUT stackoverflow
{
"settings": {
"analysis": {
"analyzer": {
"customanalyzer": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"lowercase",
"standard",
"generatewordparts"
]
}
},
"filter": {
"generatewordparts": {
"type": "word_delimiter",
"split_on_numerics": false,
"split_on_case_change": false,
"generate_word_parts": true,
"generate_number_parts": false,
"stem_english_possessive": false,
"catenate_all": false
}
}
}
},
"mappings": {
"emptags": {
"properties": {
"employeeid": {
"type": "integer"
},
"tagName": {
"type": "text",
"fielddata": true,
"analyzer": "customanalyzer",
"search_analyzer": "customanalyzer"
}
}
}
}
}
GET stackoverflow/emptags/1
{
"employeeid": 1,
"tagName": "social_security_number"
}
GET stackoverflow/_analyze
{
"analyzer" : "customanalyzer",
"text" : "social_security_number123"
}
GET stackoverflow/_search
{
"query": {
"query_string": {
"default_field": "tagName",
"query": "*curi*"
}
}
}
另一个解决方案是规范化您的输入并将任何您想要视为空格的符号(例如下划线)替换为空格。
请在此处阅读更多