elasticsearch 通行证-&引用;在弹性搜索查询中
当我们传递一个包含特殊字符的查询时,弹性搜索就是拆分文本。 例如,如果我们通过了查询中的“测试”,我们如何进行弹性搜索,将其视为单个单词而不是拆分 我们正在搜索的字段上使用的分析器:
elasticsearch 通行证-&引用;在弹性搜索查询中,
elasticsearch,lucene,
elasticsearch,Lucene,当我们传递一个包含特殊字符的查询时,弹性搜索就是拆分文本。 例如,如果我们通过了查询中的“测试”,我们如何进行弹性搜索,将其视为单个单词而不是拆分 我们正在搜索的字段上使用的分析器: "text_search_filter": { "type": "edge_ngram", "min_gram": 1, "max_gram": 15 }, "standard_stop_filter": { "type":
"text_search_filter": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 15
},
"standard_stop_filter": {
"type": "stop",
"stopwords": "_english_"
}
},
"analyzer": {
"text_search_analyzer": {
"type": "custom",
"tokenizer": "whitespace",
"filter": [
"lowercase",
"asciifolding",
"text_search_filter"
]
}
}
此外,还可以使用以下查询进行搜索:
"query": {
"multi_match": {
"query": "test-test",
"type": "cross_fields",
"fields": [
"FIELD_NAME"
],
}
}
{
"tokens": [
{
"token": "'",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'t",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'te",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'tes",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-t",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-te",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-tes",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-test",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
},
{
"token": "'test-test'",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
}
]
}在我的代码中,我捕获了所有包含“-”的单词,并为其添加了引号 例如: 乔·多伊->“乔·多伊” 这方面的java代码:
static String placeWordsWithDashInQuote(String value) {
return Arrays.stream(value.split("\\s"))
.filter(v -> !v.isEmpty())
.map(v -> v.contains("-") && !v.startsWith("\"") ? "\"" + v + "\"" : v)
.collect(Collectors.joining(" "));
}
在这个示例之后,查询如下所示:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"fields": [
"lastName",
"firstName"
],
"query": "\"joe-doe\"",
"default_operator": "AND"
}
}
]
}
},
"sort": [],
"from": 0,
"size": 10 }
在我的代码中,我捕获所有包含“-”的单词,并为其添加引号 例如: 乔·多伊->“乔·多伊” 这方面的java代码:
static String placeWordsWithDashInQuote(String value) {
return Arrays.stream(value.split("\\s"))
.filter(v -> !v.isEmpty())
.map(v -> v.contains("-") && !v.startsWith("\"") ? "\"" + v + "\"" : v)
.collect(Collectors.joining(" "));
}
在这个示例之后,查询如下所示:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"fields": [
"lastName",
"firstName"
],
"query": "\"joe-doe\"",
"default_operator": "AND"
}
}
]
}
},
"sort": [],
"from": 0,
"size": 10 }
您的用例是什么?您的
映射是什么?
?因为有不同的方法来实现这一点,使用Analyzer更新并查询搜索。我们可以看到使用分析器创建了一个标记“test test”。curl-XGET'localhost:9200/your\u index\u name/\u analyze?analyzer=test\u search\u analyzer'-d'test test test'您在输出中看到标记“test test”了吗?您确定要搜索的所有字段都应用了test\u search\u分析器吗?因为test是一个令牌,它应该匹配。您没有使用不同的search\u analyzer
对吗?您的用例是什么?您的映射是什么?
?因为有不同的方法来实现这一点,使用Analyzer更新并查询搜索。我们可以看到使用分析器创建了一个标记“test test”。curl-XGET'localhost:9200/your\u index\u name/\u analyze?analyzer=test\u search\u analyzer'-d'test test test'您在输出中看到标记“test test”了吗?您确定要搜索的所有字段都应用了test\u search\u分析器吗?因为test是一个令牌,它应该匹配。您没有使用不同的search\u分析器
对吗?