ElasticSearch NEST - 查找带有特殊字符的结果
ElasticSearch NEST - Find results with special characters
我正在尝试在弹性索引上编写一个搜索查询,它将 return 我从字段值的任何部分得到结果。
我有一个 Path
字段,其中包含像 C:\temp\ab-cd\abc.doc
这样的值
我希望能够发送一个查询,该查询将return我所写内容中的任何匹配部分
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "abc"),
};
上面会return结果,这个不会:
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "ab-cd"),
};
其他任何特殊字符也是如此,例如 @#$%^&* 等等。
是否有一些通用的方法来发送查询并准确找到我搜索的内容?
我的每个字段都是 multi-fields
,我可以使用 *.raw
选项,但不完全知道如何或是否应该
使用 nGrams 将文本拆分成更小的块,并使用 term
过滤器对其进行查询。亲:应该更快。缺点:索引(磁盘 space)的大小会更大,因为会生成更多术语(来自 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
,您需要注意一件事:您需要转义特殊字符。例如 -
、\
和 :
(完整列表 here). Also, when indexing, the \
char needs escaping, otherwise it will issue an error. This is what I tested especially with query_string
: https://gist.github.com/astefan/a52fa4989bf5298102d1
我正在尝试在弹性索引上编写一个搜索查询,它将 return 我从字段值的任何部分得到结果。
我有一个 Path
字段,其中包含像 C:\temp\ab-cd\abc.doc
我希望能够发送一个查询,该查询将return我所写内容中的任何匹配部分
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "abc"),
};
上面会return结果,这个不会:
QueryContainer currentQuery = new QueryStringQuery
{
DefaultField = "Path",
Query = string.Format("*{0}*", "ab-cd"),
};
其他任何特殊字符也是如此,例如 @#$%^&* 等等。
是否有一些通用的方法来发送查询并准确找到我搜索的内容?
我的每个字段都是 multi-fields
,我可以使用 *.raw
选项,但不完全知道如何或是否应该
使用 nGrams 将文本拆分成更小的块,并使用 term
过滤器对其进行查询。亲:应该更快。缺点:索引(磁盘 space)的大小会更大,因为会生成更多术语(来自 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
,您需要注意一件事:您需要转义特殊字符。例如 -
、\
和 :
(完整列表 here). Also, when indexing, the \
char needs escaping, otherwise it will issue an error. This is what I tested especially with query_string
: https://gist.github.com/astefan/a52fa4989bf5298102d1