V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
colinxt
V2EX  ›  Elasticsearch

ES 新人请教大佬精确查询的问题

  •  
  •   colinxt · 196 天前 · 2100 次点击
    这是一个创建于 196 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本人是 ES 新人,目前被安排一个项目有 ES 的,大概背景如下:

    SaaS 项目,没有分库,ES 存储文章内容,并发不高没做分布式。ES 由前人设计,7.9 版本,一个索引存了所有数据,包括文章正文、标题、作者、摘要等等。正文采用 text 类型。整个索引用了 ik 分词并设置为 ik_max_word ,正文字段的搜索分词用 ik smart ,并设置了 fielddata 。

    现在有租户提需求,希望通过关键词查询正文,并且要求结果里一定要出现完整的关键词。听上去很普通的需求?但是有问题啊啊,用 term 一直都会返回一些,不多,但完全没有搜索关键词的结果。

    一开始以为是保留词的问题,所以把用户关心的几个关键词全加到保留词列表里( ik/config 下面,并配置好,重启,重建索引),但结果还是一样。也试过用 .keyword ,查询结果数量更少了。。

    查了网上很多资料,看上去很简单的问题。有没有大佬给指个路?

    感恩感恩。

    7 条回复    2024-06-19 17:03:27 +08:00
    riverdd
        1
    riverdd  
       196 天前
    ```
    "query": {
    "bool": {
    "should": [
    {"match": {"entry": { "query": req.kw, "minimum_should_match": "-25%"}}},
    {"match_phrase": {"entry": { "query": req.kw, "slop": 5, "boost": 100}}}
    ],
    },
    },
    ```

    试试这样?很久以前写的 query ,我都不记得这些参数啥意思了。
    rqrq
        2
    rqrq  
       196 天前
    把关键词加到 analysis-ik 目录里的 main.dic ,放到最前面。
    查询例子
    {"size":20,"from":0,"_source":["_id"],"highlight":{"require_field_match":false,"fields":{"title":{},"tags":{},"category":{}}},"query":{"bool":{"must":[{"range":{"status":{"gt":0}}},{"bool":{"should":[{"multi_match":{"query":"关键词","boost":10,"fields":["title^2","tags","category"]}}]}}]}}}
    lix7
        3
    lix7  
       195 天前
    不考虑停用词的话,match_phrase
    考虑停用词的话,可以加一个 property ,直接单字切分,然后在这个属性上做 match_phrase
    colinxt
        4
    colinxt  
    OP
       194 天前
    谢谢各位大佬。

    我先试试 match_phrase 。

    @rqrq 想问下,你的意思是说,es 用 dic 文件做分词是有顺序的?即放在前面的先分词?比如,“中国现代化”放前面,那么先分了这个词,如果 dic 后面有“中国”就不会分了?


    @lix7 请教一下,单字切分的意思是给查询字段的每个字都分出来?这样不是跟 ik 分词矛盾了? 😂
    lix7
        5
    lix7  
       194 天前
    @colinxt #4 一个 property 可以有多个 field ,字段默认作为 ik field ,再加一个 field 配不同的分词器用于单字分词就行,一般看情况还可以加精准匹配 keyword 、拼音、前后缀啥的。
    查询的时候可以用 name.ik ,name.ngram ,name.keyword, name.prefix, name.suffix, name.pinyin
    colinxt
        6
    colinxt  
    OP
       194 天前
    @lix7 明白了,就是说这个 property 里的 field 相当于这个字段的不同视图,每个视图可以配置不同的分词器等配置属性,但内容上都是这个字段。
    谢谢大佬!
    HetFrame
        7
    HetFrame  
       186 天前
    先看看你的 es 构建版本 flavor 是不是 default ,如果是,可以用 wildcard 字段,这个字段专门用于"*关键词*"这样的模糊搜索,比直接在 keyword 类型字段上快很多。构建方法可以像 5 楼说的那样建立多字段类型,查询的话就 {"query":{"wildcard":{"content.wildcard":"*中国现代化化*"}}}
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   941 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:42 · PVG 06:42 · LAX 14:42 · JFK 17:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.