如何在弹性搜索中用空格分隔和不带空格进行搜索

时间:2021-02-10 05:33:18

标签: elasticsearch dsl

我的查询在下面

  • 我正在使用一些聚合函数在弹性搜索集群中搜索 L1 L2
  • 我正在将 L1 L2 转换为 L1L2

要求

  • 我需要先搜索 L1 L2(高权重)
  • 然后我需要分别搜索 L1L2

我的模板在'query': '**L1* OR *L2**下面需要更新

template =  {
  'from': 0,
  'size': 10,
  'aggs': {
    'Tester': {
      'terms': {
        'field': 'Tester.name.keyword',
        'order': {
          '_key': 'desc'
        }
      }
    },
    'Developer': {
      'terms': {
        'field': 'Developer.name.keyword',
        'order': {
          '_key': 'desc'
        }
      }
    },
    'Analyst': {
      'terms': {
        'field': 'Analyst.name.keyword',
        'order': {
          '_key': 'desc'
        }
      }
    }
  },
  'query': {
    'bool': {
      'must': {
        'query_string': {
          'query': '**L1* OR *L2**'
        }
      },
      'filter': {
        'term': {
          'parentName.keyword': 'Software Department'
        }
      }
    }
  }
}

有没有办法在不改变设置的情况下实现

1 个答案:

答案 0 :(得分:3)

正如@David 在评论中所建议的,您可以使用 shingles token filter 来实现您的用例。

添加一个工作示例,它清楚地显示了包含 L1 L2 的文档的更高分数,而 L1L2 文档也出现在搜索结果中。 >

索引映射

{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "shingle"
                    ]
                }
            }
        }
    },
    "mappings": {
        "properties": {
            "name": {
                "type": "text",
                "analyzer": "my_analyzer"
            }
        }
    }
}

索引示例文档

{
    "name" : "L1 L2"
}

{
    "name" : "L1"
}
{
    "name" : "L2"
}

搜索查询

{
    "query": {
        "match": {
            "name": "L1 L2"
        }
    }
}

和搜索响应

 "hits": [
            {
                "_index": "shingleside",
                "_type": "_doc",
                "_id": "1",
                "_score": 1.0462961,
                "_source": {
                    "name": "L1 L2"
                }
            },
            {
                "_index": "shingleside",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.5619608,
                "_source": {
                    "name": "L1"
                }
            },
            {
                "_index": "shingleside",
                "_type": "_doc",
                "_id": "3",
                "_score": 0.5619608,
                "_source": {
                    "name": "L2"
                }
            }
        ]