首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python ElasticSearch查询显示多个匹配的假阳性

Python ElasticSearch查询显示多个匹配的假阳性
EN

Stack Overflow用户
提问于 2018-08-12 17:44:53
回答 1查看 596关注 0票数 0

尝试为最终用户创建一个可搜索的仪表板,在csv数据集上具有全文搜索功能,其中包含使用ElasticSearch和python的研究主题。

搜索将返回相关csv行的行索引。有多个列,即_id, topic

如果我试图查询数据集中的"cyber security"。我得到了包含单词"cyber security""cyber-security"的大多数结果,但返回的还有其他行,它们涉及粮食安全和军队安全。对于一般的搜索术语,如何避免这种情况?

此外,搜索术语"cyber“或"cyber security"不包含一些包含"cybersecurity""cybernetics"等词的主题。

我将如何写一个条件,可以捕捉这些?请记住,这也需要另一种方式,即如果我搜索"food security",网络主题不应该出现。

代码语言:javascript
复制
def test_search():
    client = Elasticsearch()
    q = Q("multi_match", query='cyber security',
          fields=['topic'],
          operator='or')
    s = Search(using=client, index="csvfile").query(q) \

    # .filter('term', name="food")
    # .exclude("match", description="beta")

编辑:根据注释中的要求添加样例要求

csv文件可以如下所示。

代码语言:javascript
复制
_id,topic
1,food security development in dairy
2,securing hungry people by providing food
3,cyber security in army
4,bio informatics for security
5,cyber security in the world
6,food security in the world
7,cyberSecurity in world
8,army security in asia
9,cybernetics in the world
10,cyber security in the food industry.
11,cyber-information
12,cyber security 
13,secure secure army man
14,crytography for security
15,random stuff

可接受

搜索词是cyber -> 3,5,7,9,10,11,12

搜索词是security ->,除了11,14,15

搜索术语是cyber securitycybersecurity -> 3,5,7,9,10,11,12 (在这种情况下,网络需要有更高的优先级,用户不会对其他安全类型感兴趣)

搜索词是food security ->1,2

完美案例

搜索词是cybercyber securitycybersecurity-> 3,4,5,7,9,10,11,12,14

考虑到密码学和生物信息学在很大程度上是与网络安全有关的,我应该使用文档集群来实现这一点(ML技术)吗?

EN

回答 1

Stack Overflow用户

发布于 2018-08-13 05:07:02

这是一个正常的“全文”搜索行为。在弹性搜索中,文本字段是分析。标准分析器简单地标记字符串,并将所有令牌转换为小写,然后将它们添加到倒排索引中。当索引"food security""cyber security""cyber-security""army security""cybersecurity""cybernetics"时,倒排索引如下所示:

代码语言:javascript
复制
"food" -> ["food security"]
"cyber" -> ["cyber security", "cyber-security"]
"army" -> ["army security"]
"security" -> ["food security", "cyber security", "cyber-security", "army security"]
"cybersecurity" -> ["cybersecurity"]
"cybernetics" -> ["cybernetics"]

然后,当您搜索"food security"时,搜索字符串将被分析为["food", "security"]"food""security"倒排索引中的所有条目都将匹配,即:["food security", "cyber security", "cyber-security", "army security"]。另一方面,搜索"cybersecurity"只会与"cybersecurity"匹配。

编辑:接近解决方案

在您的需求中有几个不同的“特性”:

将所有内容组合在一起,我们可以得到以下映射(有关自定义映射的说明,请参见这个职位 )

代码语言:javascript
复制
{
  "mappings": {
    "_doc": {
      "properties": {
        "id": {
          "type": "keyword",
          "ignore_above": 256
        },
        "topic": {
          "type": "text",
          "analyzer": "english",
          "fields": {
            "fourgrams": {
              "type": "text",
              "analyzer": "fourgrams"
            }
          }
        }
      }
    }
  },
  "settings": {
    "analysis": {
      "filter": {
        "fourgrams_filter": {
          "type": "ngram",
          "min_gram": 4,
          "max_gram": 4
        }
      },
      "analyzer": {
        "fourgrams": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "fourgrams_filter"
          ]
        }
      }
    }
  }
}

和下面的搜索查询

代码语言:javascript
复制
GET topics/_search 
{
  "size": 20,
  "query": {
    "bool": {
      "should": [
        {
          "common": {
            "topic": {
              "query": "cyber security",
              "cutoff_frequency": 0.3,
              "boost": 2
            }
          }
        },
        {
          "match": {
            "topic.fourgrams": "cyber security"
          }
        }
      ]
    }
  }
}

你仍然会有错误的底片,但希望它们能按照预期的顺序排序,这样你就可以过滤掉较低的分数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51811358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档