我正在使用匹配词组查询在ES中查找。但我注意到返回的结果不合适。 代码-
res = es.search(index=('indice_1'),
body = {
"_source":["content"],
"query": {
"match_phrase":{
"content":"xyz abc"
}}}
,
size=500,
scroll='60s')
我没有记录内容的位置- “嗨,我叫isxyz abc。”和“嘿wassupxyz abc。生活怎么样”
使用正则表达式在mongodb中进行类似的搜索也将同时获得两条记录。任何帮助将不胜感激。
答案 0 :(得分:2)
如果您未指定分析仪,则默认情况下使用standard
。它将执行基于语法的标记化。因此,您对短语“ hi my name isxyz abc”的称呼。将会类似于[hi, my, name, isxyz, abc]
,而match_phrase
正在寻找彼此相邻的术语[xyz, abc]
(除非您指定slop
)。
您可以使用其他分析器,也可以修改查询。如果您使用match
查询,则它将与术语“ abc”匹配。如果要使短语匹配,则需要使用其他分析器。 NGrams应该适合您。
这是一个例子:
PUT test_index
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "ngram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit"
]
}
}
}
},
"mappings": {
"_doc": {
"properties": {
"content": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}
}
PUT test_index/_doc/1
{
"content": "hi my name isxyz abc."
}
PUT test_index/_doc/2
{
"content": "hey wassupxyz abc. how is life"
}
POST test_index/_doc/_search
{
"query": {
"match_phrase": {
"content": "xyz abc"
}
}
}
这导致找到两个文档。
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 0.5753642,
"hits": [
{
"_index": "test_index",
"_type": "_doc",
"_id": "2",
"_score": 0.5753642,
"_source": {
"content": "hey wassupxyz abc. how is life"
}
},
{
"_index": "test_index",
"_type": "_doc",
"_id": "1",
"_score": 0.5753642,
"_source": {
"content": "hi my name isxyz abc."
}
}
]
}
}
编辑:
如果您要进行wildcard
查询,则可以使用standard
分析器。您在注释中指定的用例将像这样添加:
PUT test_index/_doc/3
{
"content": "RegionLasit Pant0Q00B000001KBQ1SAO00"
}
您可以使用wildcard
进行查询:
POST test_index/_doc/_search
{
"query": {
"wildcard": {
"content.keyword": {
"value": "*Lasit Pant*"
}
}
}
}
基本上,您正在进行没有nGram
分析器的子字符串搜索。您的查询短语将仅为"*<my search terms>*"
。我仍然建议您调查nGrams
。
答案 1 :(得分:0)
您还可以使用type参数设置查询中的词组
res = es.search(index=('indice_1'),
body = {
"_source":["content"],
"query": {
"query":"xyz abc"
},
type:"phrase"}
,
size=500,
scroll='60s')