Elasticsearch/Lucene 正则表达式 fquery/query_string 未返回所有文档
Elasticsearch/Lucene Regex fquery/query_string not returning all documents
我目前在 Elasticsearch 中有这个映射,我正在使用 not_analyzed
字段建立索引:
PUT /twitter/_mapping/tweet
{
"tweet": {
"properties" : {
"user" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
}
PUT /twitter/tweet/1
{
"user": "CNN"
}
PUT /twitter/tweet/2
{
"user": "cnn"
}
PUT /twitter/tweet/3
{
"user": "Cnn"
}
PUT /twitter/tweet/4
{
"user": "cNN"
}
PUT /twitter/tweet/5
{
"user": "CnN"
}
我想像这样使用不区分大小写的过滤器搜索此索引(通过 NEST 生成,因此在更改此查询语法时不太灵活):
POST /twitter/tweet/_search
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"fquery": {
"query": {
"query_string": {
"query": "user:/[cC][nN][nN]/"
}
}
}
}
]
}
}
}
}
}
虽然查询了 returns 1 个文档:"user": "cnn"
(小写),但不是所有文档。
这是为什么? "query": "user:CNN"
returns 具有正确大小写(大写)的正确文档的相同查询。
EDIT:此外,如果我删除带有 cnn
(小写)的文档,则查询 returns 没有任何内容。
编辑 2:如果这是我的 NEST 代码的问题,这里是用于生成查询的代码:
// property path would be something like "user". queryTerm would be something like "cnn"
filterDescriptor.Query(
q =>
q.QueryString(
d =>
d.Query(string.Format("{0}:{1}", propertyPath,
GetCaseInsentitiveRegexExpression(queryTerm))))); // returns something like /[cC][nN][nN]/
您需要设置lowercase_expanded_terms:false
。默认情况下 lowercase_expanded_terms 设置为 true
小写通配符,正则表达式查询。
示例:
POST /twitter/tweet/_search
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"fquery": {
"query": {
"query_string": {
"query": "user:/[Cc][nN][nN]/",
"lowercase_expanded_terms": false
}
}
}
}
]
}
}
}
}
}
或者在嵌套代码中,它会是这些行
q.QueryString(
d =>
d.Query(string.Format("{0}:{1}", propertyPath,
GetCaseInsentitiveRegexExpression(queryTerm))).LowercaseExpendedTerms(false))
我目前在 Elasticsearch 中有这个映射,我正在使用 not_analyzed
字段建立索引:
PUT /twitter/_mapping/tweet
{
"tweet": {
"properties" : {
"user" : {
"type" : "string",
"index": "not_analyzed"
}
}
}
}
PUT /twitter/tweet/1
{
"user": "CNN"
}
PUT /twitter/tweet/2
{
"user": "cnn"
}
PUT /twitter/tweet/3
{
"user": "Cnn"
}
PUT /twitter/tweet/4
{
"user": "cNN"
}
PUT /twitter/tweet/5
{
"user": "CnN"
}
我想像这样使用不区分大小写的过滤器搜索此索引(通过 NEST 生成,因此在更改此查询语法时不太灵活):
POST /twitter/tweet/_search
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"fquery": {
"query": {
"query_string": {
"query": "user:/[cC][nN][nN]/"
}
}
}
}
]
}
}
}
}
}
虽然查询了 returns 1 个文档:"user": "cnn"
(小写),但不是所有文档。
这是为什么? "query": "user:CNN"
returns 具有正确大小写(大写)的正确文档的相同查询。
EDIT:此外,如果我删除带有 cnn
(小写)的文档,则查询 returns 没有任何内容。
编辑 2:如果这是我的 NEST 代码的问题,这里是用于生成查询的代码:
// property path would be something like "user". queryTerm would be something like "cnn"
filterDescriptor.Query(
q =>
q.QueryString(
d =>
d.Query(string.Format("{0}:{1}", propertyPath,
GetCaseInsentitiveRegexExpression(queryTerm))))); // returns something like /[cC][nN][nN]/
您需要设置lowercase_expanded_terms:false
。默认情况下 lowercase_expanded_terms 设置为 true
小写通配符,正则表达式查询。
示例:
POST /twitter/tweet/_search
{
"from": 0,
"size": 10,
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"fquery": {
"query": {
"query_string": {
"query": "user:/[Cc][nN][nN]/",
"lowercase_expanded_terms": false
}
}
}
}
]
}
}
}
}
}
或者在嵌套代码中,它会是这些行
q.QueryString(
d =>
d.Query(string.Format("{0}:{1}", propertyPath,
GetCaseInsentitiveRegexExpression(queryTerm))).LowercaseExpendedTerms(false))