动态修改输入以搜索存储在ElasticSearch中的数据

dw1jzc5e  于 2023-01-08  发布在  ElasticSearch
关注(0)|答案(1)|浏览(135)

我是ElasticSearch的新手,阅读了很多关于它的书,但我在一个要求上跌跌撞撞。
考虑 * 索引 * 中所有 * 文档 * 中的 * 文本 * 类型字段为“app_data
现在,app_data字段始终存储一个单词,但该单词可以是字母数字、数字、字母。

要求-

存储在app_data中的一种类型的单词类似于-
第一个月
现在,如果用户希望搜索此app_data,则输入如下内容
"99.IPAB.99999.9"

  • 另一个示例 * -索引中的数据

app_data:"78IGDB900459JI"类似于-"78.IGDB.90045.9"的用户搜索
如果可行的话,我应该如何构造ES查询来匹配存储在索引文档中的数据?

注意事项-

1.在插入到索引的过程中,我无法编辑数据(使用自定义分析器),因为app_data可能包含简单的单词,如“RED”、“RED 567”。
1.只有对于上面提到的问题,我认为我必须使用自定义分析器沿着查询DSL。

i7uaboj4

i7uaboj41#

假设您的数据已经建立了索引并且不能更改,我的建议是在将搜索词发送到查询之前应用一个模式,删除.“",99.IPAB.99999.9 -〉99 ipab 999999。
这样,您就可以成功地应用match_phrase_prefix
如果不能将模式应用于输入,可以在搜索时“search_analyzer“应用。
我们建议创建一个生成不带.""的标记的解析器。在查询中添加“analyzer”:“my_analyzer”,这样生成的标记就不带.“”,匹配也会正常工作。
新分析仪:

PUT my-index-000001
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": """\.""",
          "replacement": ""
        }
      },
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "filter": [
            "lowercase"
          ],
          "char_filter": [
            "my_char_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "app_data": {
        "type": "text",
        "analyzer": "standard"
      }
    }
  }
}

质询

POST my-index-000001/_bulk
{"index":{}}
{"app_data":"99IPAB999999FG"}
{"index":{}}
{"app_data":"78IGDB900459JI"}

POST my-index-000001/_search
{
  "from": 0,
  "size": 5,
  "query": {
   "match_phrase_prefix": {
     "app_data": {
       "query": "78.IGDB.90045.9",
       "analyzer": "my_analyzer"
     }
   }
  }
}

点击数

"hits": [
  {
    "_index": "my-index-000001",
    "_id": "_jNxfoUBQB-6H-4Z6KWM",
    "_score": 0.6931471,
    "_source": {
      "app_data": "78IGDB900459JI"
    }
  }
]

相关问题