atomicdata-dev / atomic-server

An open source headless CMS / real-time database. Powerful table editor, full-text search, and SDKs for JS / React / Svelte.
https://atomicserver.eu
MIT License
925 stars 44 forks source link

Chinese / Japanese / Korean tokenizer support for search / tantivy #882

Open joepio opened 3 months ago

joepio commented 3 months ago

Out of the box, Tantivy only support latin languages. We could add some extra tokenizers:

Chinese (tantivy-jieba and cang-jie), Japanese (lindera, Vaporetto, and tantivy-tokenizer-tiny-segmenter) and Korean (lindera + lindera-ko-dic-builder)

I'm not sure if tokenizers can be combined. It doesn't look like it...

Tokenizer-specific fields

use tantivy::schema::{Schema, SchemaBuilder, TEXT};

fn create_schema() -> Schema {
    let mut schema_builder = SchemaBuilder::default();

    // Create a field for English with a specific tokenizer
    schema_builder.add_text_field("english_text", TEXT);

    // Create a field for Chinese with a different tokenizer
    schema_builder.add_text_field("chinese_text", TEXT);

    schema_builder.build()
}

Problem with this approach is that it is very inefficient, it makes the search DB way bigger for every extra tokenizer we have

One Tokenizer To Rule Them All

Not sure if this is possible. We now use the SimpleTokenizer, but that is apparently not good for Chinese chars.

Select tokenizer as config option

We can make the user decide when booting up AtomicServer. This would add some code complexity. It would not work for mixed language instances.

shidianxia commented 3 months ago

Another possible approach: Generate JSON file at runtime and use off-the-shelf search engine server to read the data.

  1. add a config field to determine whether to generate JSON(already done by 'atomic-server export' but not at runtime), and probably a generating schedule
  2. user could choose their own each engine like Algolia, Meilisearch...
joepio commented 3 months ago
  1. user could choose their own each engine like Algolia, Meilisearch...

That would work as a fallback, but it would not integrate with the front-end. I think AtomicServer should provide a good out-of-the-box experience.