ElasticSearch NEST -查找带有特殊字符的结果
本文关键字:特殊字符 结果 NEST 查找 ElasticSearch | 更新日期: 2023-09-27 18:11:35
我正在尝试编写一个搜索查询弹性索引,将返回我的结果从字段值的任何部分。
我有一个Path
字段,包含C:'temp'ab-cd'abc.doc
我想发送一个查询的能力,将返回我的任何匹配部分从我写的
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "abc"),
};
上面会返回结果,下面不会:
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "ab-cd"),
};
同样适用于任何其他特殊字符,如@#$%^&*等等。
是否有一些通用的方式来发送查询并找到我搜索的内容?
我的每个字段都是multi-fields
,我可以使用*.raw
选项,但不完全知道如何或如果我应该
使用nGrams将文本分割成更小的块,并使用term
过滤器进行查询。利:它应该更快。缺点:索引的大小(磁盘空间)将更大,因为生成了更多的术语(来自nGram过滤器)。
PUT /test
{
"settings": {
"analysis": {
"analyzer": {
"my_ngram_analyzer": {
"tokenizer": "keyword",
"filter": [
"substring"
]
}
},
"filter": {
"substring": {
"type": "nGram",
"min_gram": 1,
"max_gram": 50
}
}
}
},
"mappings": {
"test": {
"properties": {
"Path": {
"type": "string",
"index_analyzer": "my_ngram_analyzer",
"search_analyzer": "keyword"
}
}
}
}
}
和查询:
GET /test/test/_search
{
"query": {
"term": {
"Path": {
"value": "'temp"
}
}
}
}
如果你愿意,你可以使用上面的配置作为你已经拥有的任何映射的子字段。
如果你想使用query_string
,有一件事你需要注意:你需要转义特殊字符。例如,-
、'
和:
(完整的列表在这里)。此外,在索引时,'
字符需要转义,否则将发出错误。这是我测试的,特别是与query_string
: https://gist.github.com/astefan/a52fa4989bf5298102d1