0

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

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

如果我尝试查询数据集以获取"cyber security". 我得到的大部分结果都包含单词"cyber security",或者"cyber-security"返回了其他涉及食品安全和军队安全的行。对于一般搜索词,如何避免这种情况?

此外,搜索词“ cyber”或"cyber security"不会选择包含诸如"cybersecurity"或之类的某些主题"cybernetics"

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

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 文件可以如下所示。

_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

完美案例
搜索词是cyberor -> cyber security3,4,5,7,9,10,11,12,14cybersecurity

考虑到密码学和生物信息学几乎与网络安全相关,我是否应该使用文档集群来实现这一点(ML 技术)?

4

1 回答 1

2

这是一种正常的“全文”搜索行为。在 Elasticsearch 中,会分析文本字段。标准分析器只是对字符串进行标记并将所有标记转换为小写,然后再将它们添加到倒排索引。当您索引"food security", "cyber security", "cyber-security",时"army security",倒排索引如下所示:"cybersecurity""cybernetics"

"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"


编辑:接近解决方案

您的要求中有几个不同的“功能”:

  • security必须与secureand匹配securing。这可以通过将单词的所有变形形式组合在一起的英语分析器来实现。
  • cybersecurity必须与 , 等匹配cybercybernetics这可以通过ngram 分析器来实现
  • 搜索时cyber security,不匹配food security. 这可以通过设置适当的常用术语查询来实现cutoff_frequency
  • 匹配语义接近的词(例如“网络安全”和“密码学”)。据我所知,这无法通过 Elasticsearch 实现。

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

{
  "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"
          ]
        }
      }
    }
  }
}

和以下搜索查询

GET topics/_search 
{
  "size": 20,
  "query": {
    "bool": {
      "should": [
        {
          "common": {
            "topic": {
              "query": "cyber security",
              "cutoff_frequency": 0.3,
              "boost": 2
            }
          }
        },
        {
          "match": {
            "topic.fourgrams": "cyber security"
          }
        }
      ]
    }
  }
}

您仍然会有漏报,但希望它们会按预期顺序排序,以便您可以过滤掉较低的分数。

于 2018-08-13T05:07:02.547 回答