我对mongodb上的一个不区分大小写的查询有一个非常烦人的问题.
我在Web应用程序中使用MongoTemplate,我需要对集合执行不区分大小写的查询.
用这个代码
Query q = new Query();
q.addCriteria(Criteria.where("myField")
.regex(Pattern.compile(fieldValue, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE)));
return mongoTemplate.findOne(q,MyClass.class);
Run Code Online (Sandbox Code Playgroud)
我创建以下查询
{ "myField" : { "$regex" : "field value" , "$options" : "iu"}}
Run Code Online (Sandbox Code Playgroud)
当我有简单的文字时,它可以很好地工作,例如:
caPITella CapitatA
但是......但是......当有括号()时,查询不起作用.它根本不起作用,即使查询文本是按照文档中所写的那样写的......示例:
查询1:
{"myField" : "Ceratonereis (Composetia) costae" } -> 1 result (ok)
Run Code Online (Sandbox Code Playgroud)
查询2:
{ "myField" : {
"$regex" : "Ceratonereis (Composetia) costae" ,
"$options" : "iu"
}} -> no results (not ok)
Run Code Online (Sandbox Code Playgroud)
查询3:
{ "scientificName" : {
"$regex" : "ceratonereis (composetia) costae" ,
"$options" : "iu"
}} …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 SearchContext、IndexSearcherHelperUtil 和所有其他东西为 Liferay 7.3.5 GA6 开发一个自定义 Web 内容搜索 portlet。
\n我有一些具有不同字段的 DDMStructure,从我在 elasticsearch 索引上看到的情况来看,这些字段在嵌套文档中建立索引,如下所示:
\n"ddmFieldArray": [\n{\n"ddmFieldName": "ddm__text__37702__nome_it_IT",\n"ddmValueFieldName": "ddmFieldValueText_it_IT",\n"ddmFieldValueText_it_IT": "Nome esempio",\n"ddmFieldValueText_it_IT_String_sortable": "nome esempio"\n}\n,\n{\n"ddmFieldName": "ddm__text__37702__descrizione_breve_it_IT",\n"ddmValueFieldName": "ddmFieldValueText_it_IT",\n"ddmFieldValueText_it_IT": "Esempio di descrizione breve da indicizzare",\n"ddmFieldValueText_it_IT_String_sortable": "esempio di descrizione breve da indicizzare"\n}\n]\nRun Code Online (Sandbox Code Playgroud)\n这与我以前知道的旧方式不同,其中自定义字段的索引如下ddm__[keyword/text]__[structure_id]__[field_name]
现在,我明白\xc2\xa0这种不同的索引方式是由于为了避免弹性问题而进行的改进(已超出总字段的限制)但是......执行搜索后, com.liferay.portal中没有ddmFieldArray .kernel.search.Document .getFields,因此我无法从弹性搜索索引中获取 ddmstruct 字段值。
\n这是代码:
\nlong journalArticleClassId = ClassNameLocalServiceUtil.getClassNameId(JournalArticle.class.getName());\n\nSearchContext searchContext = new SearchContext();\nsearchContext.setClassTypeIds(new long[] {journalArticleClassId});\nsearchContext.setCompanyId(companyId);\nsearchContext.setStart(QueryUtil.ALL_POS);\nsearchContext.setEnd(QueryUtil.ALL_POS);\n \nBooleanQuery query = new BooleanQueryImpl();\n \n \nMatchQuery approvedQuery = new MatchQuery(Field.STATUS, String.valueOf(WorkflowConstants.STATUS_APPROVED));\n\nquery.add(approvedQuery, BooleanClauseOccur.MUST.getName());\n\n\nHits resultHits = IndexSearcherHelperUtil.search(searchContext, …Run Code Online (Sandbox Code Playgroud)