Question de mapping (je débute)

Bonjour a tous ,
ma question est la suivante :
je ne vois pas quel token ou mapping utilisé pour remédier a ma problématique :
dans mon moteur de recherche local pour pdf (avec le plug in ingest attachment).
lorsque j'écris un par exemple un prénom , il va me trouver dans le document toute les fois ou le prénom est mentionné , mais j'aimerais qu'il me le souligne qu'une seul fois.
ayant quelque difficulté a écrire ma problématique en anglais, je ne sais pas forcement la formuler dans la langue de shakespear . Je vous ai mis les settings de mon index "pdf".
merci pour vos réponse

{
  "settings": {
    "index": {
      "max_ngram_diff": "20",
      "blocks": {
        "write": "true"
      },
      "provided_name": "pdf",
      "creation_date": "1632383182575",
      "sort": {
        "field": "web_path",
        "order": "desc"
      },
      "analysis": {
        "analyzer": {
          "name_analyzer": {
            "filter": [
              "lowercase"
            ],
            "type": "custom",
            "tokenizer": "trigram"
          }
        },
        "tokenizer": {
          "trigram": {
            "type": "nGram",
            "min_gram": "5",
            "max_gram": "15"
          }
        }
      },
      "number_of_replicas": "1",
      "uuid": "KoQ6cySVQ-uWl3lNFEbX2w",
      "version": {
        "created": "7140199"
      },
      "codec": "best_compression",
      "highlight": {
        "max_analyzed_offset": "10000000"
      },
      "routing": {
        "allocation": {
          "include": {
            "_tier_preference": "data_content"
          }
        }
      },
      "number_of_shards": "2"
    }
  },
  "defaults": {
    "index": {
      "flush_after_merge": "512mb",
      "final_pipeline": "_none",
      "max_inner_result_window": "100",
      "unassigned": {
        "node_left": {
          "delayed_timeout": "1m"
        }
      },
      "max_terms_count": "65536",
      "rollup": {
        "source": {
          "name": "",
          "uuid": ""
        }
      },
      "lifecycle": {
        "name": "",
        "parse_origination_date": "false",
        "step": {
          "wait_time_threshold": "12h"
        },
        "indexing_complete": "false",
        "rollover_alias": "",
        "origination_date": "-1"
      },
      "routing_partition_size": "1",
      "force_memory_term_dictionary": "false",
      "max_docvalue_fields_search": "100",
      "merge": {
        "scheduler": {
          "max_thread_count": "4",
          "auto_throttle": "true",
          "max_merge_count": "9"
        },
        "policy": {
          "floor_segment": "2mb",
          "max_merge_at_once_explicit": "30",
          "max_merge_at_once": "10",
          "max_merged_segment": "5gb",
          "expunge_deletes_allowed": "10.0",
          "segments_per_tier": "10.0",
          "deletes_pct_allowed": "33.0"
        }
      },
      "max_refresh_listeners": "1000",
      "max_regex_length": "1000",
      "load_fixed_bitset_filters_eagerly": "true",
      "number_of_routing_shards": "2",
      "write": {
        "wait_for_active_shards": "1"
      },
      "verified_before_close": "false",
      "mapping": {
        "coerce": "false",
        "nested_fields": {
          "limit": "50"
        },
        "depth": {
          "limit": "20"
        },
        "field_name_length": {
          "limit": "9223372036854775807"
        },
        "total_fields": {
          "limit": "1000"
        },
        "nested_objects": {
          "limit": "10000"
        },
        "ignore_malformed": "false"
      },
      "source_only": "false",
      "soft_deletes": {
        "enabled": "true",
        "retention": {
          "operations": "0"
        },
        "retention_lease": {
          "period": "12h"
        }
      },
      "max_script_fields": "32",
      "query": {
        "default_field": [
          "*"
        ],
        "parse": {
          "allow_unmapped_fields": "true"
        }
      },
      "format": "0",
      "frozen": "false",
      "sort": {
        "missing": [],
        "mode": []
      },
      "priority": "1",
      "max_rescore_window": "10000",
      "max_adjacency_matrix_filters": "100",
      "analyze": {
        "max_token_count": "10000"
      },
      "gc_deletes": "60s",
      "top_metrics_max_size": "10",
      "optimize_auto_generated_id": "true",
      "hidden": "false",
      "translog": {
        "generation_threshold_size": "64mb",
        "flush_threshold_size": "512mb",
        "sync_interval": "5s",
        "retention": {
          "size": "-1",
          "age": "-1"
        },
        "durability": "REQUEST"
      },
      "auto_expand_replicas": "false",
      "mapper": {
        "dynamic": "true"
      },
      "recovery": {
        "type": ""
      },
      "requests": {
        "cache": {
          "enable": "true"
        }
      },
      "data_path": "",
      "routing": {
        "rebalance": {
          "enable": "all"
        },
        "allocation": {
          "include": {
            "_tier": ""
          },
          "disk": {
            "watermark": {
              "ignore": "false"
            }
          },
          "exclude": {
            "_tier": ""
          },
          "require": {
            "_tier": ""
          },
          "enable": "all",
          "total_shards_per_node": "-1"
        }
      },
      "search": {
        "slowlog": {
          "level": "TRACE",
          "threshold": {
            "fetch": {
              "warn": "-1",
              "trace": "-1",
              "debug": "-1",
              "info": "-1"
            },
            "query": {
              "warn": "-1",
              "trace": "-1",
              "debug": "-1",
              "info": "-1"
            }
          }
        },
        "idle": {
          "after": "30s"
        },
        "throttled": "false"
      },
      "fielddata": {
        "cache": "node"
      },
      "default_pipeline": "_none",
      "max_slices_per_scroll": "1024",
      "shard": {
        "check_on_startup": "false"
      },
      "xpack": {
        "watcher": {
          "template": {
            "version": ""
          }
        },
        "version": "",
        "ccr": {
          "following_index": "false"
        }
      },
      "percolator": {
        "map_unmapped_fields_as_text": "false"
      },
      "allocation": {
        "max_retries": "5",
        "existing_shards_allocator": "gateway_allocator"
      },
      "refresh_interval": "1s",
      "indexing": {
        "slowlog": {
          "reformat": "true",
          "threshold": {
            "index": {
              "warn": "-1",
              "trace": "-1",
              "debug": "-1",
              "info": "-1"
            }
          },
          "source": "1000",
          "level": "TRACE"
        }
      },
      "compound_format": "0.1",
      "blocks": {
        "metadata": "false",
        "read": "false",
        "read_only_allow_delete": "false",
        "read_only": "false"
      },
      "max_result_window": "10000",
      "store": {
        "stats_refresh_interval": "10s",
        "type": "",
        "fs": {
          "fs_lock": "native"
        },
        "preload": [],
        "snapshot": {
          "snapshot_name": "",
          "index_uuid": "",
          "cache": {
            "prewarm": {
              "enabled": "true"
            },
            "enabled": "true",
            "excluded_file_types": []
          },
          "repository_uuid": "",
          "uncached_chunk_size": "-1b",
          "index_name": "",
          "partial": "false",
          "blob_cache": {
            "metadata_files": {
              "max_length": "64kb"
            }
          },
          "repository_name": "",
          "snapshot_uuid": ""
        }
      },
      "queries": {
        "cache": {
          "enabled": "true"
        }
      },
      "shard_limit": {
        "group": "normal"
      },
      "warmer": {
        "enabled": "true"
      },
      "max_shingle_diff": "3",
      "query_string": {
        "lenient": "false"
      }
    }
  }
}

Bonjour :wave:t3:

Parles-tu de highlighting ici ?

oui en effet avec python flask et elasticsearch_dsl
c'est peut le nombre de fragment que je dois gérer par ex "number_of_fragments" : 3

Je n'ai pas vu d'option de ce genre.

je vais relire la doc sur le highlighting de ES .
je confond surement , mais le fragment_size a voir avec le nombre de fois que ça highlitght v?
c'est la première fois que j'écris pour demander et je suis un peu intimider et je crois bien qu'il faut j'étaye un peu plus je reformulerais mieux et j'essayerai en anglais, merci d'avoir tout de même pris le temps de me répondre
Je m'excuse pour le dérangement .

Dans l'idéal, essaye d'accompagner ta question avec un script qui permet de reproduire facilement le problème et qui permet de proposer éventuellement une solution.

Peux-tu fournir un script qui permet de reproduire ton cas ? Comme expliqué ici : About the Elasticsearch category. Essaye de faire un exemple le plus simple possible (pas besoin de tous les champs).

Un tel script est quelque chose qu'on peut coller dans la Dev Console de Kibana et cliquer sur le bouton "RUN" pour reproduire ton cas. Un tel script permet de mieux comprendre ce que tu fais et d'obtenir une résolution plus rapide de ta question.

Merci pour les conseils je vais essayer d’être plus clair et d'étayer ma requete :slight_smile: .
j'ai paramétré mon "higlight" pour que la taille du fragment surligné soit lié a la longueur du texte que j'affiche
search.py :
s.highlight('stored_attachment.content', fragment_size=preview_len) #preview_len donnée à changé en config.py
config.py preview_len = 400
search_result.html <span>Trouvé dans le fichier: <b>{{ len(search_results['content']) }}</b></span>
Quand je réduit la taille du "preview len" bien entendu cela réduit la taille du texte afficher. Mais ce que je n'arrive pas résoudre , c'est que quand je réduit le preview len mon document s'affiche autant de fois que le mot que je recherche apparaît.
Alors je me pose la question suivantes : Le highlight est peut être pas la meilleur des moyens d'arriver a mon objectif. peut être dois_je modifier les propriétés de mon mon Index ES (avec kibana) . La façon dont je recherche dans le fichier peut être (python). Peut être dois-je rajouté un autre analyzer (pour l'instant que lower case).

Un exemple concret et simple m'aiderait à mieux comprendre ce que tu fais, ce que tu obtiens et ce que tu voudrais.