Полнотекстовый поиск MySQL через несколько таблиц

Это - путь, как передать аргументы функциям. Передача ссылкой означает, что параметр вызванных функций совпадет с передаваемым аргументом вызывающих сторон (не значение, но идентификационные данные - сама переменная). Передача значением означает, что параметр вызванных функций будет копией передаваемого аргумента вызывающих сторон. Значение будет тем же, но идентификационные данные - переменная - отличается. Таким образом изменения в параметре, сделанном вызванной функцией в одном случае, изменяются, аргумент передал, и в другом случае просто изменяет значение параметра в вызванной функции (который является только копией). В быстрой спешке:

  • Java только поддерживает передачу значением. Всегда аргументы копий, даже при том, что при копировании ссылки на объект, параметр в вызванной функции укажет на тот же объект, и изменения в том объекте будут, посмотрите в вызывающей стороне. Так как это может сбивать с толку, здесь то, что Jon Skeet должен сказать об этом.
  • C# поддерживает передачу значением и передачу ссылкой (ключевое слово ref, используемое в вызывающей стороне и вызванной функции). У Jon Skeet также есть хорошее объяснение этого здесь .
  • C++ поддерживает передачу значением и передачу ссылкой (тип параметра ссылки, используемый в вызванной функции). Вы найдете ниже объяснение этого.

Коды

, Так как мой язык является C++, я буду использовать это здесь

// passes a pointer (called reference in java) to an integer
void call_by_value(int *p) { // :1
    p = NULL;
}

// passes an integer
void call_by_value(int p) { // :2
    p = 42;
}

// passes an integer by reference
void call_by_reference(int & p) { // :3
    p = 42;
}

// this is the java style of passing references. NULL is called "null" there.
void call_by_value_special(int *p) { // :4
    *p = 10; // changes what p points to ("what p references" in java)
    // only changes the value of the parameter, but *not* of 
    // the argument passed by the caller. thus it's pass-by-value:
    p = NULL;
}

int main() {
    int value = 10;
    int * pointer = &value;

    call_by_value(pointer); // :1
    assert(pointer == &value); // pointer was copied

    call_by_value(value); // :2
    assert(value == 10); // value was copied

    call_by_reference(value); // :3
    assert(value == 42); // value was passed by reference

    call_by_value_special(pointer); // :4
    // pointer was copied but what pointer references was changed.
    assert(value == 10 && pointer == &value);
}

, И пример в Java не причинит боль:

class Example {
    int value = 0;

    // similar to :4 case in the c++ example
    static void accept_reference(Example e) { // :1
        e.value++; // will change the referenced object
        e = null; // will only change the parameter
    }

    // similar to the :2 case in the c++ example
    static void accept_primitive(int v) { // :2
        v++; // will only change the parameter
    }        

    public static void main(String... args) {
        int value = 0;
        Example ref = new Example(); // reference

        // note what we pass is the reference, not the object. we can't 
        // pass objects. The reference is copied (pass-by-value).
        accept_reference(ref); // :1
        assert ref != null && ref.value == 1;

        // the primitive int variable is copied
        accept_primitive(value); // :2
        assert value == 0;
    }
}

Википедия

http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value

http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference

Этот парень в значительной степени закрепляет его:

http://javadude.com/articles/passbyvalue.htm

13
задан Hari Prasad 11 July 2013 в 16:03
поделиться

3 ответа

MySQL не может создать полнотекстовый (или любой) индекс для нескольких таблиц. Таким образом, использование единого индекса отсутствует.

В качестве альтернативы вы можете:

  1. Использовать индекс для каждой таблицы и, при необходимости, соединение / объединение для получения строк, соответствующих вашим требованиям.

  2. Создать агрегированная таблица для применения индекса.

  3. Используйте такой инструмент, как lucene или solr, для создания индекса поиска. (Если вы выбираете какой-либо масштаб, это, вероятно, лучший вариант)

12
ответ дан 1 December 2019 в 23:15
поделиться

просто выполните:

select * from table a where a.col=myval
union
select * from table b where b.col=myval
..

индексы используются так же, как и при обычном выборе.

2
ответ дан 1 December 2019 в 23:15
поделиться

With your setup being what appears to be a type of message board I assume that you have three tables (correct me if I am wrong):

  1. Message Table (Message_ID, Title, Body, Description, Author)
  2. Tag Table (Tag_ID, Name)
  3. Message Tags (Message_ID, Tag_ID)

Here is how I would do it

SELECT Message.Message_ID, Message.Title, Message.Description, Message.Author, 
  IFNULL( 
    MATCH (Name)
    AGAINST (?)
    , 
    IFNULL(
      MATCH (Message.Title)
      AGAINST (?)
      ,
      MATCH (Message.Body)
      AGAINST (?)
    )
  ) AS Relevance 
FROM Message, Tag, Message_Tag 
WHERE Message.Message_ID = Message_Tag.Message_ID AND Message_Tag.Tag_ID = Tag.Tag_ID   
  AND (
    MATCH (Name) 
    AGAINST (?)
  OR 
    MATCH (Message.Title)
    AGAINST (?)
  OR 
    MATCH (Message.Body)
    AGAINST (?)
  )
1
ответ дан 1 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: