无法在Elasticsearch中使用符号搜索查询

Yab*_*706 6 lucene indexing python-3.x elasticsearch

我一直在尝试使用elasticsearch python客户端匹配查询,但是即使使用转义字符并设置了一些自定义分析器并将其映射后,也无法匹配它。我想使用搜索&,但未给出任何响应。

from elasticsearch import Elasticsearch

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])


doc1 = {
    'name': 'numb',
    'band': 'linkin_park',
    'year': '2006'
}

doc2 = {
    'name': 'Powerless &',
    'band': 'linkin_park',
    'year': '2006'
}
doc3 = {
    'name': 'Crawling !',
    'band': 'linkin_park',
    'year': '2006'
    }

doc =[doc1, doc2, doc3]
'''
create_index = {
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "filter": [
                        "lowercase"
                    ],
                    "tokenizer": "whitespace"
                }
            }
        }
    }
}

es.indices.create(index="idx_temp", body=create_index)
'''
for i in range(3):
    es.index(index="idx_temp", doc_type='_doc', id=i, body=doc[i])


my_mapping = {
  "properties": {
      "name": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  'ignore_above': 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      },
      "band": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      },
      "year": {
          "type": "text",
          "fields": {
              "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
              }
          },
          "analyzer": "my_analyzer"
          "search_analyzer": "my_analyzer"
      }
  }
}

es.indices.put_mapping(index='idx_temp', body=my_mapping, doc_type='_doc', include_type_name=True)

res = es.search(index='idx_temp', body={
    "query": {
        "match": {
            "name": {
                "query": "powerless &",
                "fuzziness": 3

            }
        }
    }
})

for hit in res['hits']['hits']:
    print(hit['_source'])

Run Code Online (Sandbox Code Playgroud)

预期的输出是,'name': 'Poweeerless &',但我得到了0次点击,没有返回任何值。

Yab*_*706 2

所以我通过添加另一个字段解决了这个问题

 "search_quote_analyzer": "my_analyzer"
Run Code Online (Sandbox Code Playgroud)

之后到设置字段

"analyzer": "my_analyzer"
"search_analyzer": "my_analyzer"
Run Code Online (Sandbox Code Playgroud)

然后我通过&在查询中搜索来获取输出

'name': 'Poweeerless &'
Run Code Online (Sandbox Code Playgroud)