2015-09-01 2 views
1

настоящее время у меня это отображение в Elasticsearch, что я индексации с not_analyzed поля:Elasticsearch/Lucene Regex fquery/QUERY_STRING не возвращает все документы

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]/" 
        } 
       } 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 

этот запрос возвращает только 1 документы, хотя: "user": "cnn" (в нижнем регистре), а не все документы.

Почему это? Тот же запрос с "query": "user:CNN" возвращает правильный документ с правильным корпусом (в верхнем регистре).

EDIT: Кроме того, если я удалю документ с cnn (в нижнем регистре), запрос ничего не возвращает.

EDIT 2: В случае, если это проблема с моим НЕСТ кодом, вот код, используемый для создания запроса:

// 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]/ 

ответ

1

Вам нужно установить 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)) 
Смежные вопросы