如何在弹性搜索中实现不区分大小写和标点符号,原谅小的拼写错误,模糊?
How to implement Case and Punctuation Insenstive,forgive minor spelling mistakes, fuzziness in elastic Search?
我正在使用弹性搜索搜索 json 文件。我插入了数据。现在我想在 DSL 查询中加入一些条件。我必须合并
1) 基本的模糊性,例如不区分大小写和标点符号,并原谅前缀匹配中的小拼写错误
2) 如果搜索文本包含 3 个以上的字符,我应该 return 所有距离搜索文本最多 2 个编辑距离的搜索查询。
我正在执行第二个条件,但在编写满足这两个条件的查询时遇到困难。谁能告诉我如何编写查询?以下是目前编写的代码
from flask import Flask, request
import json
import requests
import pprint
app = Flask(__name__)
__URL__ = "http://localhost:9200"
__HEAD__ = {'Content-Type': 'application/json'}
def query_data(query: str, fuzz=1):
url = __URL__ + '/sample_data/_search'
payload = json.dumps({
'query': {
'fuzzy': {
'search_term': {
'value': query,
'fuzziness': fuzz,
# 'prefix_length': 3 // The number of initial characters which will not be “fuzzified”.
# // This helps to reduce the number of terms which must be examined.
}
}
},
'sort': { 'search_term': { 'order': 'desc' } }
})
resp = requests.get(url=url, data=payload, headers=__HEAD__)
return resp.json()
@app.route('/elasty')
def elasty():
q=request.args.get('q')
if len(q) > 3:
result = query_data(q, 2)
else:
result = query_data(q)
return json.dumps(result)
if __name__ == '__main__':
app.run()
排序有问题。
更改
'sort': { 'search_term': { 'order': 'desc' } }
到
'sort': { 'FieldLong': { 'order': 'desc', "missing": "_last", "unmapped_type": "long" } }
我已经试过了,这很管用。
我正在使用弹性搜索搜索 json 文件。我插入了数据。现在我想在 DSL 查询中加入一些条件。我必须合并
1) 基本的模糊性,例如不区分大小写和标点符号,并原谅前缀匹配中的小拼写错误
2) 如果搜索文本包含 3 个以上的字符,我应该 return 所有距离搜索文本最多 2 个编辑距离的搜索查询。
我正在执行第二个条件,但在编写满足这两个条件的查询时遇到困难。谁能告诉我如何编写查询?以下是目前编写的代码
from flask import Flask, request
import json
import requests
import pprint
app = Flask(__name__)
__URL__ = "http://localhost:9200"
__HEAD__ = {'Content-Type': 'application/json'}
def query_data(query: str, fuzz=1):
url = __URL__ + '/sample_data/_search'
payload = json.dumps({
'query': {
'fuzzy': {
'search_term': {
'value': query,
'fuzziness': fuzz,
# 'prefix_length': 3 // The number of initial characters which will not be “fuzzified”.
# // This helps to reduce the number of terms which must be examined.
}
}
},
'sort': { 'search_term': { 'order': 'desc' } }
})
resp = requests.get(url=url, data=payload, headers=__HEAD__)
return resp.json()
@app.route('/elasty')
def elasty():
q=request.args.get('q')
if len(q) > 3:
result = query_data(q, 2)
else:
result = query_data(q)
return json.dumps(result)
if __name__ == '__main__':
app.run()
排序有问题。
更改
'sort': { 'search_term': { 'order': 'desc' } }
到
'sort': { 'FieldLong': { 'order': 'desc', "missing": "_last", "unmapped_type": "long" } }
我已经试过了,这很管用。