我正在尝试在 flex 索引上编写搜索查询,该查询将从字段值的任何部分返回结果。
我有一个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
,则需要注意一件事:需要转义特殊字符。例如-
,\
和:
(完整列表here)。同样,在建立索引时,\
char需要转义,否则它将发出错误。这是我特别使用query_string
测试的内容:https://gist.github.com/astefan/a52fa4989bf5298102d1
关于c# - ElasticSearch NEST-查找带有特殊字符的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32451951/