我很难找到ElasticSearch查询意外的结果。将下列文档编入ElasticSearch。
{
"group": "J00-I99", codes: [
{ "id": "J15", "description": "hello world" },
{ "id": "J15.0", "description": "test one world" },
{ "id": "J15.1", "description": "test two world J15.0" },
{ "id": "J15.2", "description": "test two three world J15" },
{ "id": "J15.3", "description": "hello world J18 " },
............................ // Similar records here
{ "id": "J15.9", "description": "hello world new" },
{ "id": "J16.0", "description": "new description" }
]
}
这里我的目标是实现自动完成功能,为此我使用了n-gram方法。我不想使用完全的暗示方法。
目前我有两个问题:
搜索查询(id和描述字段):j15
预期结果:包括j15在内的所有上述结果实际结果:得到的结果很少(j15.0、j15.1、j15.8)
搜索查询(id和description字段):测试2
预期结果:
{ "id": "J15.1", "description": "test two world J15.0" },
{ "id": "J15.2", "description": "test two three world J15" },
实际结果:
{ "id": "J15.0", "description": "test one world" },
{ "id": "J15.1", "description": "test two world J15.0" },
{ "id": "J15.2", "description": "test two three world J15" },
然后像这样Map。
{
settings: {
number_of_shards: 1,
analysis: {
filter: {
ngram_filter: {
type: 'edge_ngram',
min_gram: 2,
max_gram: 20
}
},
analyzer: {
ngram_analyzer: {
type: 'custom',
tokenizer: 'standard',
filter: [
'lowercase', 'ngram_filter'
]
}
}
}
},
mappings: {
properties: {
group: {
type: 'text'
},
codes: {
type: 'nested',
properties: {
id: {
type: 'text',
analyzer: 'ngram_analyzer',
search_analyzer: 'standard'
},
description: {
type: 'text',
analyzer: 'ngram_analyzer',
search_analyzer: 'standard'
}
}
}
}
}
}
搜索查询:
GET myindex/_search
{
"_source": {
"excludes": [
"codes"
]
},
"query": {
"nested": {
"path": "codes",
"query": {
"bool": {
"should": [
{
"match": {
"codes.description": "J15"
}
},
{
"match": {
"codes.id": "J15"
}
}
]
}
},
"inner_hits": {}
}
}
}
注意:文档索引的大小会很大。这里只提到样本数据。
对于第二个问题,我可以使用multi\u match with and操作符吗?
GET myindex/_search
{
"_source": {
"excludes": [
"codes"
]
},
"query": {
"nested": {
"path": "codes",
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "J15",
"fields": ["codes.id", "codes.description"],
"operator": and
}
}
]
}
},
"inner_hits": {}
}
}
}
任何帮助将非常感谢,因为我有困难的时间来解决这个问题。
3条答案
按热度按时间arknldoa1#
添加索引Map、搜索查询和搜索结果的工作示例
索引Map:
索引数据:
搜索查询:
搜索结果:
xzlaal3s2#
添加另一个答案,因为这是一个不同的问题和第一个答案是集中在第一个问题。
问题是你的第二个问题
test two
退货test one world
以及在索引时使用ngram_analyzer
它使用的是标准的分析器,它将文本拆分为空格,而您的搜索分析器也是standard
因此,如果在索引文档和搜索词上使用analyze api,您将看到它与标记匹配:和生成的代币
你的搜索词呢
test two
```{
"tokens": [
{
"token": "test",
"start_offset": 0,
"end_offset": 4,
"type": "",
"position": 0
},
{
"token": "two",
"start_offset": 5,
"end_offset": 8,
"type": "",
"position": 1
}
]
}
{
"_source": {
"excludes": [
"codes"
]
},
"query": {
"nested": {
"path": "codes",
"query": {
"bool": {
"must": {
"multi_match": {
"query": "test two",
"fields": [
"codes.id",
"codes.description"
],
"operator" :"AND"
}
}
}
},
"inner_hits": {}
}
}
}
"hits": [
{
"_index": "myindexedge64170045",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "codes",
"offset": 2
},
"_score": 2.6901608,
"_source": {
"id": "J15.1",
"description": "test two world J15.0"
}
},
{
"_index": "myindexedge64170045",
"_type": "_doc",
"_id": "1",
"_nested": {
"field": "codes",
"offset": 3
},
"_score": 2.561376,
"_source": {
"id": "J15.2",
"description": "test two three world J15"
}
}
]
}
}
}
}
falq053o3#
问题是默认情况下
inner_hits
只返回3个匹配的文档,如官方文档中所述,大小
每次内部点击返回的最大点击数。默认情况下,返回前三个匹配的命中。
只需添加
size
参数在你的内部点击得到所有的搜索结果。在您的示例数据上尝试了此操作,并查看了第一个查询的搜索结果,该查询仅返回3个搜索结果
第一个查询搜索结果