sunking1 2023-02-26 08:26 采纳率: 0%
浏览 67
已结题

elasticsearch堆叠关键词导致搜索结果失真,如何实现语义搜索

目前我在用elasticsearch 进行一个知识管理系统的搭建,现在遇到一个问题,在进行知识搜索时会因为关键词堆叠导致结果不准确,请问如何优化查询。
例如我搜索:程序员如何快速处理故障。
由于elasticsearch数据中部分文章中存在很多类似如下内容(目前采用结巴分词搜索,导致程序员命中率过高):


示例文字:
程序员应该快速学习,程序员,程序员
程序员(英文Programmer)是从事程序开发、程序维护的基层工作人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚。随着互联网的不断普及,网络上把男程序员称作“程序猿”,女程序员称作“程序媛”。


由于关键词“程序员”出现的频次过高,导致最终搜索的结果,更倾向于关键词“程序员”,而不是整句话,请问如何改进查询,实现真正的语义查询。有点类似搜索引擎的反关键词重复SEO。

搜索代码如下:

    query = {         
                    "size":Icount,
                    "query": {
                               "match": {
                                         fieldName: {
                                                     "query":queryString,
  #                                                   "cutoff_frequency": 0.015
                                                     "minimum_should_match": "98%"
                                                    },
                                          },
                              },
                 }

  • 写回答

7条回答 默认 最新

  • CodeBytes 2023-02-26 08:44
    关注

    该回答引用ChatGPT

    1、调整分词器
    可以尝试使用不同的分词器来优化查询,例如使用基于语义的分词器,如中文分词器ansj、jieba-analysis等,或者使用更为严格的分词器,如IK Analyzer,这些分词器可以更准确地切分文本,避免关键词的重复出现。

    2、调整搜索算法
    可以使用更为复杂的搜索算法,如布尔搜索、短语搜索等,通过设置搜索算法的权重、距离等参数来调整搜索结果,避免关键词的重复出现对搜索结果的影响。

    3、调整查询语句
    可以在查询语句中加入其他条件,如过滤器,设置查询条件的匹配规则,如AND、OR等,避免仅仅依赖关键词的出现次数来确定搜索结果。

    4、调整数据模型
    可以考虑对数据模型进行调整,如使用更加规范的文本,避免重复的关键词出现,或者将关键词拆分为多个属性,减少关键词堆叠的可能性。

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    可以根据具体情况进行参考和修改:

    1、修改查询语句,使用短语搜索

    
    query = {
        "size":Icount,
        "query": {
            "match_phrase": {
                fieldName: {
                    "query":queryString,
                    "slop": 5
                }
            }
        }
    }
    
    

    这里使用了 match_phrase 查询,它会将搜索字符串作为一个整体来搜索,而不是分开匹配。通过设置 slop 参数,可以控制搜索短语中允许的词语间隔数,使得搜索结果更加准确。

    2、调整分词器,使用基于语义的分词器

    
    query = {
        "size":Icount,
        "query": {
            "match": {
                fieldName: {
                    "query":queryString,
                    "analyzer": "ik_smart"
                }
            }
        }
    }
    
    

    这里使用了 IK Analyzer 分词器,它是一款基于中文语义的分词器,可以更加准确地切分文本,避免关键词的重复出现。使用 ik_smart 模式,可以更好地处理中文搜索。

    3、调整数据模型,避免关键词重复出现
    根据业务需求,可以调整数据模型,将关键词拆分为多个属性,避免关键词重复出现的情况,例如:

    {
      "title": "程序员如何快速处理故障",
      "description": "程序员应该快速学习,程序员,程序员",
      "content": "程序员(英文Programmer)是从事程序开发、程序维护的基层工作人员。一般将程序员分为程序设计人员和程序编码人员,但两者的界限并不非常清楚。随着互联网的不断普及,网络上把男程序员称作“程序猿”,女程序员称作“程序媛”。"
    }
    
    

    然后可以在查询语句中指定搜索的字段,例如:

    
    query = {
        "size":Icount,
        "query": {
            "multi_match": {
                "query": queryString,
                "fields": ["title", "description", "content"],
                "type": "cross_fields",
                "operator": "and",
                "minimum_should_match": "98%"
            }
        }
    }
    
    

    这里使用了 multi_match 查询,指定了需要搜索的字段,通过设置 type 参数为 cross_fields,可以对多个字段进行匹配,通过设置 operator 参数为 and,可以将多个查询条件合并为一个,避免关键词重复出现的情况。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月6日
  • 修改了问题 2月26日
  • 修改了问题 2月26日
  • 修改了问题 2月26日
  • 展开全部

悬赏问题

  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探