初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2014-10-23 20:17:47

白薔薇
Member

部分一致のものをカウントしたい

いつも拝見させていただいております。
「データ」「検索語句」のテーブルがあり
「データ」のファイル名Aと「検索語句」のファイル名B(ユニーク)を比較し、検索語句の方に何回使用されたかカウント数を出したいと思っております

単純にリレーションを行いカウントすると、完全一致でのカウント数のようなのですが、部分一致のカウント数を出したいです。
「データ」のレコード数は60万〜、「検索語句」のレコード数は20万くらいのデータになります。

「データ」のファイル名A
あいうABCD.jpg
かきCDF.JPG
さしすせABCZ.gif


「検索語句」のファイル名B
ABC---2回
CDF---1回


ご存じの方がいらっしゃいましたら、よろしくお願いいたします。
MacOSX 10.8.5 Filemaker13

Offline

#2 2014-10-23 21:59:47

Hiro
Member

Re: 部分一致のものをカウントしたい

部分一致照合の特殊リレーションを組み、その関連レコードの数をCountします。

部分一致照合リレーションの設定要領は、

「検索語句」テーブル                             「データ」テーブル

● 検索語句::検索語句 (ABC)         <=  データ::ピラミット分解データ (あいうABCD.jpg¶いうABCD.jpg¶うABCD.jpg¶ABCD.jpg¶BCD.jpg¶CD.jpg¶D.jpg ・・・・・)
AND
● 検索語句::Max検索語句 (ABC龥)  >  データ::ピラミット分解データ (あいうABCD.jpg¶いうABCD.jpg¶うABCD.jpg¶ABCD.jpg¶BCD.jpg¶CD.jpg¶D.jpg ・・・・・)



「Max検索語句」は計算フィールドでその式は、
  検索語句 & "龥"


「ピラミット分解データ」は計算フィールドでその式(再帰式)は、
  Let([
    $prm=データ;
    $res="";
    $fnc=
      "Case(
        IsEmpty($prm); $res;
        Let([$res=List($res;$prm);$prm=Middle($prm;2;Length($prm))];Evaluate($fnc))
      )"
  ];
    Evaluate($fnc)
  )

その計算結果例は、
  あいうABCD.jpg
  いうABCD.jpg
  うABCD.jpg
  ABCD.jpg
  BCD.jpg
  CD.jpg
  D.jpg
  .jpg
  jpg
  pg
  g

Last edited by Hiro (2014-10-24 16:50:05)

Offline

#3 2014-10-24 10:58:01

sorter
Guest

Re: 部分一致のものをカウントしたい

>「検索語句」のレコード数は20万
これの結果が全部一度に必要なわけじゃないですよね?
データ側に索引が使えないと大変そうですが、=リレーションでなくても大丈夫?

#4 2014-10-24 14:00:32

honda
Guest

Re: 部分一致のものをカウントしたい

データ側に自前で、n-gramのインデックス用テキストを用意するのが良いのでは。
n-gramといっても、FileMakerでは自力で転置インデックスを用意するのは面倒なので、
いわゆるn-gramではなく、uni-gram ... データ長-gram までの複合的なものにはなります。

例えば対象のデータが "あいうABCD.jpg" であれば、以下のようなテキストを生成します。

あいうABCD.jpg
あ
い
う
A
B
C
D
.
j
p
g
あい
いう
うA
AB
BC
CD
D.
.j
jp
pg
あいう
いうA
うAB
ABC
BCD
CD.
D.j
.jp
jpg
あいうA
いうAB
うABC
ABCD
BCD.
CD.j
D.jp
.jpg
あいうAB
いうABC
うABCD
ABCD.
BCD.j
CD.jp
D.jpg
あいうABC
いうABCD
うABCD.
ABCD.j
BCD.jp
CD.jpg
あいうABCD
いうABCD.
うABCD.j
ABCD.jp
BCD.jpg
あいうABCD.
いうABCD.j
うABCD.jp
ABCD.jpg
あいうABCD.j
いうABCD.jp
うABCD.jpg
あいうABCD.jp
いうABCD.jpg

このようなテキストデータであれば、マルチキーとして索引は生成されますし、
ポータル等でインクリメンタルに拾い上げることも可能です。

ポータルフィルタが導入される前は、ポータルでの検索に多用していました。
ポータルフィルタで速度が問題になる場合や、今回のケースの様に、
動的なレイアウト上のフィルタリングではなく、カウントやその後に処理の必要な場合では、
今でも融通の利く自前のインデックスの方が手軽だと思います。


以下は、私が使っていたn-gram生成用のカスタム関数3つを、fmxmlsnippetにしたものです
(ただしRemoveDuplicates()は、Andrew Persons作の http://www.briandunning.com/cf/492 を改変したもの )。
ver.7の頃に作った古いものなので雑ですが、とりあえずこういう記述で使えます。

RemoveDuplicates (ngram ( 対象データ ; 0 ))
<fmxmlsnippet type="FMObjectList">

	<CustomFunction id="1" functionArity="4" visible="True" parameters="text;size;repeat;counter" name="cut_in"><Calculation><![CDATA[Case (
	  counter ≤ repeat ;
	  If ( counter = 1 ; LeftValues ( text ;1 ) ; "" ) & Middle ( text ; counter ; size ) & ¶ &
	  cut_in ( LeftValues ( text ;1 ) ; size ; repeat ; counter + 1 );
	)]]></Calculation></CustomFunction>

	<CustomFunction id="2" functionArity="2" visible="True" parameters="text;counter" name="ngram"><Calculation><![CDATA[Let (
	  [
	    $s_length = Length ( text );
	    $text = If ( $s_length ≥ 40 ; Left ( text ; 40 ) ; text )
	  ];

	  Case (
	    counter ≤ $s_length ;
	    cut_in ( $text ; counter ; $s_length - counter + 1 ; 0 ) & 
	    ngram ( $text ; counter + 1 ) ;
	  )
	)]]></Calculation></CustomFunction>

	<CustomFunction id="3" functionArity="1" visible="True" parameters="text" name="RemoveDuplicates"><Calculation><![CDATA[Let ( [

	TheValue = LeftValues ( Text ; 1 ) ;
	TheCount = ValueCount ( Text ) ;
	NewText = Replace ( Substitute ( "¶" & Text & "¶" ; [ "¶" ; "¶|7_m_a|2_k_3|" ] ; [ "|7_m_a|2_k_3|" & TheValue ; "" ] ; [ "|7_m_a|2_k_3|" ; "" ] ) ; 1 ; 1 ; "" )

	] ;

	     Case ( TheCount > 0 ;

	          TheValue & RemoveDuplicates ( Replace ( NewText ; Length ( NewText ) ; 1 ; "" ) )

	     )

	)]]></Calculation></CustomFunction>

</fmxmlsnippet>

Advancedではないようなので、カスタム関数はそのまま利用できないかもしれませんが、
スクリプトなりEvaluate()の再帰なりで代用は充分可能です。

Advancedが使い得るなら、上記のfmxmlsnippetを、
拙作ですが http://filemaker-kou.seesaa.net/article/263596698.html にある、
FMClipboardEdit というツールで取り込むことは可能です。
一旦適当なカスタム関数をクリップボードにコピーし、FMClipboardEdit で Get した後、
上記 fmxmlsnippet を Set すれば、3つのカスタム関数が一括で導入できます。

自前インデックスの生成は、対象データの文字列長によりますが、
20万件でも充分実用的な速度で完了するはずです。

#5 2014-10-24 16:37:56

白薔薇
Member

Re: 部分一致のものをカウントしたい

みなさまご返信ありがとうございます。
順番に試して行っております。

>Advancedではないようなので
はい。普通のFilemakerProです。

お忙しい中ありがとうございます。

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.012 seconds, 9 queries executed - Memory usage: 517.75 KiB (Peak: 531.66 KiB) ]