WebHU - Programozási kérdések és válaszok

egyedi leképezés a leképező melléklet típusához rugalmas íves tartós rubinnal

Projektemben adatokat tárolok aktív rekordmodellben, és index html dokumentumot az elasticsearchben a mapper-attachments beépülő modul. A dokumentumleképezésem így néz ki:

include Elasticsearch::Model

settings index: { number_of_shards: 5 } do
  mappings do
    indexes :alerted
    indexes :title, analyzer: 'english', index_options: 'offsets'
    indexes :summary, analyzer: 'english', index_options: 'offsets'
    indexes :content, type: 'attachment', fields: { 
                                                    author: { index: "no"},
                                                    date: { index: "no"},
                                                    content: { store: "yes",
                                                               type: "string",
                                                               term_vector: "with_positions_offsets"
                                                            }
                                                  }
  end
end

Lefuttatok egy lekérdezést, hogy még egyszer ellenőrizzem a dokumentum-leképezést és az eredményt:

    "mappings": {
          "feed_entry": {
              "properties": {
                  "content": {
                      "type": "attachment",
                      "path": "full",
                      "fields": {
                          "content": {
                              "type": "string",
                              "store": true,
                              "term_vector": "with_positions_offsets"
                          },

Remekül működik (a fenti típus: 'melléklet'). A html doc-ban tökéletesen tudok keresni.

Teljesítményproblémám van az Activerecord-dal, ami a mysql, és nem igazán kell adatbázisban tárolnom, ezért úgy döntök, hogy áttérek az elasticsearch-ba.

Kísérletet végzek az elasticsearch-persistence< funkcióval /a> drágakő.

A leképezést az alábbiak szerint konfigurálom:

include Elasticsearch::Persistence::Model
attribute :alert_id, Integer
attribute :title, String, mapping: { analyzer: 'english' }
attribute :url, String, mapping: { analyzer: 'english' }
attribute :summary, String, mapping: { analyzer: 'english' }
attribute :alerted, Boolean, default: false, mapping: { analyzer: 'english' }
attribute :fingerprint, String, mapping: { analyzer: 'english' }
attribute :feed_id, Integer
attribute :keywords

attribute :content, nil, mapping: { type: 'attachment', fields: { 
                                                      author: { index: "no"},
                                                      date: { index: "no"},
                                                      content: { store: "yes",
                                                                 type: "string",
                                                                 term_vector: "with_positions_offsets"
                                                              }
                                                    }

de amikor lekérdezem a leképezést, valami ilyesmit kaptam:

"mappings": {
        "entry": {
            "properties": {
                "content": {
                    "properties": {
                        "_content": {
                            "type": "string"
                        },
                        "_content_type": {
                            "type": "string"
                        },
                        "_detect_language": {
                            "type": "boolean"
                        },

ami rossz. meg tudná valaki mondani, hogyan kell leképezni melléklet típussal?

Nagyon hálás vagyok a segítségéért.


  • Szia, sajnálom, hogy ebben a szakaszban nem tudok segíteni (és távol az env. atm-től); próbáltad felvenni a kapcsolatot a drágakő karbantartóival (először valószínűleg a melléklettel)? (Megengedtem magamnak, hogy hozzáadjam a linkeket a kérdésedhez). Engem is érdekel a megoldás ;) 28.12.2015
  • @gfd még nem is megoldás, de jó ötlet. Igazán értékelem. 31.12.2015

Válaszok:


1

Addig is keményen kódolnom kell a következőképpen:

  def self.recreate_index!
    mappings = {}
    mappings[FeedEntry::ELASTIC_TYPE_NAME]= {

                "properties": {
                  "alerted": {
                    "type": "boolean"
                  },
                  "title": {
                    #for exact match
                    "index": "not_analyzed",
                    "type": "string"
                  },
                  "url": {
                    "index": "not_analyzed",
                    "type": "string"
                  },                      
                  "summary": {
                    "analyzer": "english",
                    "index_options": "offsets",
                    "type": "string"
                  },
                  "content": {
                    "type": "attachment",
                    "fields": {
                      "author": {
                        "index": "no"
                      },
                      "date": {
                        "index": "no"
                      },
                      "content": {
                        "store": "yes",
                        "type": "string",
                        "term_vector": "with_positions_offsets"
                      }
                    }
                  }
                }
          }
    options = {
      index: FeedEntry::ELASTIC_INDEX_NAME,
    }
    self.gateway.client.indices.delete(options) rescue nil
    self.gateway.client.indices.create(options.merge( body: { mappings: mappings}))   
  end

Ezután írja felül a to_hash metódust

  def to_hash(options={})
    hash = self.as_json
    map_attachment(hash) if !self.alerted
    hash
  end

  # encode the content to Base64 formatj
  def map_attachment(hash)
    hash["content"] = {
      "_detect_language": false,
      "_language": "en",
      "_indexed_chars": -1 ,
      "_content_type": "text/html",
      "_content": Base64.encode64(self.content)
    }
    hash
  end

Akkor fel kell hívnom

FeedEntry.recreate_index! 

előtt készítse el a leképezést a rugalmas kereséshez. Legyen óvatos, amikor frissíti a dokumentumot, előfordulhat, hogy a content mező dupla base64-es kódolása lesz. Az én forgatókönyvemben bejelöltem a figyelmeztetett mezőt.

04.01.2016
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..